无垠之码

深度剖析代码之道


绘图工具

PlantUML和Mermaid类似都是基于文本的绘图工具,但基于Java运行环境的PlantUML更专注于软件工程图表且需要本地安装或服务器渲染,而基于Javascript运行环境的Mermaid支持更广泛的图表类型(包括甘特图、饼图等非UML图表),并且可以直接在现代浏览器中运行(需要引用mermaid-js渲染)。

其实图表的绘制语法,官方网站都有详尽介绍,本文对两者的使用方法及部分关键功能进行概述和实践示例,不做语法细节的全面展开。

1.PlantUML


标准库

在使用PlantUML绘制图标之前需要了解其提供的标准库,使用stdlib或者%get_all_stdlib命令可以展示当前版本PlantUML支持的标准库及其对应的源码项目。这里的标准库指PlantUML内置图元和功能模块的集合。具体标准使用请直接跳转至官方文档,https://plantuml.com/zh/stdlib。

  • Archimate

    Archimate是一种开放且独立的企业体系结构建模语言,它支持在业务领域内部和跨业务领域的架构描述,分析和可视化。结构化表示企业的各个组成部分,它们的相互关系及其与IT基础架构的集成关系。下图显示了ArchiMate Core框架的元素。

    image

  • Awslib|Aws

    AWS库提供了用于绘制Amazon Web Services服务和资源的图元(sprites)、宏(macros)以及其他包含文件(includes)。所有元素均基于官方的AWS架构图标生成,并结合PlantUML和C4模型,是以代码形式表达设计、部署和拓扑结构的极佳方式。Aws库功能一致,后续可能不再会支持(Warning: We are thinking about deprecating this library.)

  • Azure

    Azure库囊括一系列关于微软云相关的图标,在使用过程中可以首先包含!include <azure/AzureCommon>其提供helper宏方便使用。

  • C4

    C4模型是一个用于描述软件系统架构的可视化建模方法,由架构师Simon Brown提出在2018年发布。模型从以下四个维度,描述复杂系统全貌及系统组建之间的关系。

    1. Context系統上下文,说明系统和其使用者以及其他系統的关系
    2. Container容器,将系统分解为相关联的容器,描述一个软件系统内部的高层结构,容器是可部署/可运行的应用或服务单元
    3. Component组件,进一步细化容器内部结构,展示容器是由哪些组件组成,以及它们之间的关系。组件是构成容器的逻辑单元,通常表示容器内部的业务功能模块、服务类、控制器、DAO等
    4. Code代码,提供架构元素的涉及的细节,使用UML或者ER等既有的语法表达代码细节。
  • Classy|Classy-C4

    Classy是一个PlantUML扩展库,旨在提供更优雅、更现代化的类图绘制方式。核心目标是简化PlantUML的语法,同时增强类图的可读性和美观性。

  • Logos

    Logos是PlantUML中内置的技术品牌与开源项目Logo图标集合,格式为SVG。该图标库特别适用于开发者、DevOps 工程师等在架构图、技术栈展示中插入各类知名品牌标志(如GitHub、MySQL、Redis、Kubernetes等)。

  • Tupadr3

    Tupadr3图标库汇集了大量开发相关技术图标,包括Node.js、Docker、VS Code等。同时也集成了Devicons、Font Awesome等流行图标集中的品牌与UI元素,适用于README、技术简报与系统设计图中图标的插入。

  • Elastic|Material|Office|Kubernetes

    这些图标库包含了在开发、设计与文档中广泛使用、大家熟悉的图标与品牌标志。Elastic:Elastic Stack相关图标(如 Elasticsearch、Kibana);Material Icons:Google的Material Design图标,适用于UI设计;Office:Microsoft Office产品图标,适用于办公系统、文档管理相关系统;Kubernetes:容器编排相关图标,如Pod、Cluster、Deployment等,适用于云原生架构图;

  • Osa

    Open Security Architecture(OSA)是一个开源项目,旨在为企业架构师、系统设计师、安全专家等提供免费、可重复使用的安全架构模式Security Architecture Patterns和参考模型。 PlantUML官方标准库(stdlib)中为OSA图形符号提供的图元库,这意味着开发者可以使用OSA风格的图标(如防火墙、身份提供者、加密模块、终端等),快速构建符合OSA风格的安全架构图

  • Domainstory

    领域故事讲述(Domain Storytelling)是一种协作建模技术,它通过"讲故事"的方式来理解和记录业务领域的运作方式。这种方法特别适合在软件开发初期帮助开发人员理解业务需求。 PlantUML扩展工具包,包含用于可视化领域故事的宏(macros)、主题(themes)以及其他辅助工具,能够帮助你用PlantUML直观地记录和表达领域故事内容。

  • Cloudogu|Cloudinsight

    Cloudogu Ecosystem是一个开源、模块化、企业级DevOps平台,适合需要私有部署、工具整合和高安全性的开发团队。Cloudinsight是一个主要面向运维AIOps和IT监控分析的SaaS平台,专注于预测性运维和故障预防。PlantUML可以方便引用相关图标。

主题

PlantUML支持30多种主题,开发者可以简单使用!theme spacelab引用预置主题,使用函数%get_all_theme打印当前PlantUML版本支持的主题。

@startuml
!theme spacelab
start
:init;
-> test of color;
if (color?) is (<color:red>red) then
  :print red;
else 
  :print not red;
  note right: no color
endif
partition End {
  :end;
}
-> this is the end;
end
@enduml

预处理

一些预处理功能包含在PlantUML中,并可用于所有类型的绘图。这些功能与C语言的预处理器非常相似,只是特殊字符#改为感叹号!

Read more...

cloud-init入门

cloud-init最早由Canonical公司开发,初衷是解决云计算环境中ubuntu实例的自动化配置问题。随着云计算的普及,cloud-init的功能不断扩展,逐步加入实例启动时自动执行一系列配置任务,例如设置主机名、配置网络、安装软件包等,并且支持更多的配置操作和更多的Linux发行版,诸如Fedora、Debian、CentOS等,也开始集成cloud-init作为其云镜像的一部分,成为云平台中实例初始化的事实标准。

在cloud-init未出现之前,也有一些工具和方法用于自动化配置和管理服务器和虚拟机实例,比如

  • Kickstart是Red Hat系列发行版(如RHEL和CentOS)用于自动化安装系统的工具
  • Preseed是Debian和基于Debian的发行版(如Ubuntu,Mint)用于自动化安装的工具
  • AutoYast是SUSE Linux Enterprise和OpenSUSE的自动化安装工具
  • Ignition用于CoreOS和Flatcar Linux的初始配置工具

更强大的PXE Boot预启动执行环境(PXE)允许计算机通过网络启动,并从网络服务器下载操作系统和配置文件。其通常与Kickstart或Preseed配合使用,实现自动化安装和配置。

但是这些工具大多用于操作系统安装阶段的自动化,适用于数据中心或物理机/虚拟机部署场景,设计初衷并非针对云环境,即并非云原生。而cloud-init则是为云平台而生的,强调实例生命周期的初始化配置,并支持与云平台元数据服务(如EC2 meta-data)集成,实现更动态的配置流程。

值得一提的是,虽然cloud-init起初是为云环境设计的,但由于其通用性和灵活性,它也逐渐被用于传统虚拟机和服务器的自动化初始化任务中,不再局限于“云原生”场景。

0.初识cloud-init


在整个系统启动的过程中,cloud-init的执行包括Generator、Local、Network、Config、Final,5个阶段。cloud-init支持很多模块真正的定制工作就是由这些模块完成,在cloud-init中cloud.cfg配置决定具体的模块可以在不包括Generator的4个阶段中的哪一个阶段运行,user-data包含定制化模块的具体参数,datasource告诉cloud-init从何处读取到user-data内容,源码内部cloud-init定义了统一的抽象类接口,所有的datasource实现都要按照规范实现这些接口。

image

以下是阿里云主机导出的cloud.cfg配置文件样例,其定义整个cloud-init过程各个阶段需要执行的相关动作及配置

# The top level settings are used as module
# and system configuration.

# A set of users which may be applied and/or used by various modules
# when a 'default' entry is found it will reference the 'default_user'
# from the distro configuration specified below
users:
   - default

user:
    name: root
    lock_passwd: False

# If this is set, 'root' will not be able to ssh in and they
# will get a message to login instead as the default $user
disable_root: false

# This will cause the set+update hostname module to not operate (if true)
preserve_hostname: false

manage_etc_hosts: localhost


apt:
    preserve_sources_list: true


datasource_list: [ AliYun ]

# Example datasource config
datasource:
    AliYun:
        support_xen: false
        timeout: 5
        max_wait: 300
#      metadata_urls: [ 'blah.com' ]

# The modules that run in the 'init' stage
cloud_init_modules:
 - migrator
 - source-address
 - pip-source
 - seed_random
 - bootcmd
 - write-files
 - [ growpart, once-per-instance ]
 - [ resizefs, once-per-instance ]
 - disk_setup
 - mounts
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - ca-certs
 - rsyslog
 - users-groups
 - ssh

# The modules that run in the 'config' stage
cloud_config_modules:
# Emit the cloud config ready event
# this can be used by upstart jobs for 'start on cloud-config'.
 - emit_upstart
 - snap
 - snap_config  # DEPRECATED- Drop in version 18.2
 - ssh-import-id
 - locale
 - set-passwords
 - grub-dpkg
 - apt-pipelining
 - apt-configure
 - ubuntu-advantage
 - ntp
 - timezone
 - disable-ec2-metadata
 - runcmd
# - ntp-conf
# - chrony-conf
 - byobu

# The modules that run in the 'final' stage
cloud_final_modules:
 - snappy  # DEPRECATED- Drop in version 18.2
 - package-update-upgrade-install
 - fan
 - landscape
 - lxd
 - ubuntu-drivers
 - puppet
 - chef
 - mcollective
 - salt-minion
 - rightscale_userdata
 - scripts-vendor
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message
 - power-state-change

# System and/or distro specific settings
# (not accessible to handlers/transforms)
system_info:
   # This will affect which distro class gets used
   distro: ubuntu
   paths:
      cloud_dir: /var/lib/cloud/
      templates_dir: /etc/cloud/templates/
      upstart_dir: /etc/init/
   ssh_svcname: ssh

image

Read more...

openstack使用笔记

1.常用命令


  • 镜像相关

镜像服务(Glance)使用户能够发现、注册和获取虚拟机镜像。它提供了一个REST API,允许用户查询虚拟机镜像的元数据并获取实际的镜像文件。通过镜像服务,虚拟机镜像可以存储在多种位置,包括简单的文件系统或类似于OpenStack对象存储这样的对象存储系统中。Glance默认使用使用文件后端,将镜像存储与控制节点的/var/lib/glance/images/目录。

openstack image子命令提供操作镜像相关操作

openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| b75daf8c-308c-4724-a2ac-8645580e0145 | apline | active |
| d6517dc4-7b19-4cb5-8f77-7051a064b69b | arch   | active |
| 28677059-0367-48ec-8cd6-fb4c532c49a1 | centos | active |
+--------------------------------------+--------+--------+

openstack image show d6517dc4-7b19-4cb5-8f77-7051a064b69b -f json
{
  "checksum": "ab3aeb65083b702089dfad4ce0ed8f55",
  "container_format": "bare",
  "created_at": "2025-05-10T10:10:51Z",
  "disk_format": "qcow2",
  "file": "/v2/images/d6517dc4-7b19-4cb5-8f77-7051a064b69b/file",
  "id": "d6517dc4-7b19-4cb5-8f77-7051a064b69b",
  "min_disk": 0,
  "min_ram": 0,
  "name": "arch",
  "owner": "8477b13786304b8db735a47f0b958ae1",
  "properties": {
    "os_hidden": false,
    "os_hash_algo": "sha512",
    "os_hash_value": "784478b376b65cad399a7e6ccc081cda316ddbc48c26e6d5956e3a5d2592122d739e0d09e76a702489717f8fcc6a3f3b0ca3fe4a7c9b5eeba397990589733baa",
    "hw_qemu_guest_agent": "yes"
  },
  "protected": false,
  "schema": "/v2/schemas/image",
  "size": 541063168,
  "status": "active",
  "tags": [],
  "updated_at": "2025-05-10T10:12:15Z",
  "virtual_size": 2147483648,
  "visibility": "shared"
}

openstack image set --property hw_qemu_guest_agent=yes 28677059-0367-48ec-8cd6-fb4c532c49a1
  • 实例模板

openstack flavor(定义实例创建所分配的资源)子命令提供云实例模板的相关操作

Read more...

frida零基础入门

It’s Greasemonkey for native apps, or, put in more technical terms, it’s a dynamic code instrumentation toolkit. It lets you inject snippets of JavaScript or your own library into native apps on Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD, and QNX. Frida also provides you with some simple tools built on top of the Frida API. These can be used as-is, tweaked to your needs, or serve as examples of how to use the API.

Read more...

cowrie蜜罐

蜜罐(Honeypot)是指一种故意暴露的系统、服务或数据,用来引诱攻击者进行入侵、探测或攻击,然后监控、记录他们行为的信息化系统。其主要目的是迷惑攻击者,监控攻击行为,收集威胁情报。本文介绍的cowrie是一种模拟SSH服务器,诱捕爆破和远程登录攻击行为的中交互蜜罐。

cowrie作为一种交互式蜜罐具有以下优点:

  • 可以输出丰富的日志格式:如文本、JSON格式,方便后续处理
  • 能够直接接入SIEM系统(比如 Splunk、ELK Stack)、安全告警系统,实现实时监控
  • 轻松介入misp开源威胁情报平台
  • 虚拟文件系统,伪装度高,不容易被识破,攻击者虽然可以登录和操作,但其实运行在受控的模拟环境里,不能真正破坏宿主机
  • 记录登录行为,命令执行,收集恶意样本
  • 社区活跃,持续修复Bug、更新新功能,定制化程度高

1. 部署蜜罐


cowrie的安装官网已介绍的是否详细,这里不再赘述,为使得模拟环境更加真实,下面使用qemu虚拟机+官方的docker镜像快速搭建蜜罐环境

sudo apt-get install u-boot-qemu opensbi qemu-system qemu guestfs-tools
wget https://dl-cdn.alpinelinux.org/alpine/v3.21/releases/cloud/generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2
mv generic_alpine-3.21.2-x86_64-bios-cloudinit-r0.qcow2 alpine.qcow2
qemu-img resize ./alpine.qcow2 +10G
sudo virt-customize -a alpine.qcow2 --root-password password:123456

# 由于虚拟机内存实在太小,只能分配给qemu实例256M内存
qemu-system-x86_64 \
  --nographic \
  -m 256M \
  -smp 1 \
  -net nic -net user,hostfwd=tcp::9090-:22 \
  -drive file=alpine.qcow2,format=qcow2 

# 增加用户
useradd -m peter

# ubuntu云主机镜像需要执行下列操作实际扩容
growpart /dev/sda 1
resize2fs /dev/sda1

下面运行cowrie实例,配置关闭其关闭telnet,简单的将流量转发至后端主机9090端口,此刻攻击者通过连接8822端口,即可访问qemu虚拟机

docker run --name=cowrie \
	--user=cowrie \
	--env COWRIE_TELNET_ENABLES=no \
	--env COWRIE_SSH_LISTEN_ENDPOINTS=tcp:8822:interface=0.0.0.0 \
	--env COWRIE_HONEYPOT_BACKEND=proxy \
	--env COWRIE_PROXY_BACKEND=simple \
	--env COWRIE_PROXY_BACKEND_SSH_HOST=103.79.76.198 \
	--env COWRIE_PROXY_BACKEND_SSH_PORT=9090 \
	--env COWRIE_PROXY_BACKEND_USER=peter \
	--env COWRIE_PROXY_BACKEND_PASS=topsec \
	--volume /cowrie/cowrie-git/etc \
	--volume /cowrie/cowrie-git/var \
	--cap-drop=ALL \
	--workdir=/cowrie/cowrie-git \
	-p 8822:8822 \
	--detach=true \
	cowrie/cowrie:114c918e 

可以看到攻击者117.151.88.32使用root/1234账户登录主机,执行date命令后退出,整个会话持续96秒

Read more...

简单网络管理协议SNMP

SNMP是一种用于监控诸如,路由器,交换机,打印机,服务器,防火墙等设备的管理协议。它运行在UDP协议之上,常用端口是161,162。其中161端口用于管理请求,162端口用于trap告警通知。

作为IETF定义的一种标准协议(RFC:3411-3418),存在很多实现版本(每种实现针对不同场景和需求进行了优化或扩展),比如最常用的开源版本net-snmp,使用纯JAVA语言实现的SNMP4J,PYTHON编写的PySNMP,运用在嵌入式设备、高性能网络设备Agent的SNMP++版本,甚至很多厂商都有自己的私有实现,下文的所有操作都基于net-snmp版本

sudo apt install snmp snmpd snmptrapd snmp-mibs-downloader 
sudo download-mibs   // 下载mibs数据库

SNMP的全称简单网络管理协议,简单的含义是仅包含少数核心操作,但其实现可能相当复杂。下表列出协议规定需要实现的基本操作

操作 解释
GET 获取某个值,例如设备名、系统运行时间
GETNEXT 获取下一个OID的值(用于遍历)
SET 修改某个值,例如设置位置、启用端口
WALK 连续GETNEXT操作,相当于扫描整个MIB树
TRAP 设备主动发送事件通知(如链路断开)
INFORM 主动发送事件通知的同时,需接收方ACK确认,可靠的消息投递

1.核心概念


术语 解释
Manager(管理者) 发起查询、控制请求的设备(比如 NMS 网络管理系统)
Agent(代理) 被管理设备上运行的进程,响应请求并发送trap
MIB(管理信息库) 存储管理数据的数据库,结构是树形
OID(对象标识符) 唯一标识一个MIB对象,例如系统名、CPU 使用率等
Community String 类似密码,控制访问(public只读,private可写)

对象标识符

用于唯一标识网络设备中可管理对象的标识符。它们在MIB(管理信息库)中定义,并遵循树状的结构。OID主要有三种表示形式,便于人类阅读的模块::名字形式(SNMPv2-MIB::sysDescr.0),适合机器解析的纯数字形式(.1.3.6.1.2.1.1.1.0),混合形式(iso.3.6.1.2.1.1.1.0),详细定义可移步至参考文献1

示例:1.3.6.1.2.1.1.1.0

数字部分 名称 含义
1 iso 国际标准化组织
3 org 组织(Organization)
6 dod 国防部(Department of Defense)
1 internet Internet相关
2 mgmt 管理
1 mib-2 管理信息库版本2
1 system 系统信息
1 sysDescr 系统描述
0 实例编号 表示这是一个具体实例

资源视图

在SNMP中,“资源视图”(View)是SNMP中的重要概念,属于访问控制模型(VACM View-based Access Control Model)的一部分。它用于定义一个用户可以访问或不能访问哪些OID子树

Read more...

yara入门

YARA is a tool aimed at (but not limited to) helping malware researchers to identify and classify malware samples. With YARA you can create descriptions of malware families (or whatever you want to describe) based on textual or binary patterns.

yara(Yet Another Recursive Acronym)是一款强大的模式匹配工具(卧槽,老外的幽默是骨子里的),主要用于恶意软件分析、威胁检测和文件分类。它允许研究人员和安全分析师基于文本或二进制模式(如字符串、正则表达式、字节码等)创建规则,从而识别和分类文件或进程。

  1. 包管理工具安装

    sudo apt-get install yara yara-doc libyara8 libyara-dev python3-yara python3-yaramod libyaramod0 libyaramod-dev
    
  2. 源码安装

    git clone https://github.com/VirusTotal/yara.git
    ./bootstrap.sh && ./configure --enable-cuckoo --enable-magic --enable-dotnet
    make && make install
    

1. 核心功能


  • 基于规则的检测,使用自定义规则匹配文件、内存数据或网络流量中的特征
  • 支持多种数据类型,可检测字符串、十六进制模式、正则表达式、文件哈希等
  • 模块化设计,支持扩展模块,如PE、ELF、Mach-O、PDF、ZIP等文件格式解析
  • 跨平台,支持Windows、Linux、macOS,并可以集成到多种安全工具中,如VirusTotal、Cuckoo沙箱
  • 高性能,适用于大规模文件扫描和实时监控

2. 语法规则


yara语法规则十分简单,下面是入门文档中介绍的一则简单的样例。

Read more...

gcc部分参数说明

1.GCC -M 参数


大型工程,如果必需清楚每一个源文件都包含了哪些头文件,并且在加入或删除某些头文件时,也需要一并修改Makefile,这将是一个繁重琐碎维护性极差的工作。

  • -M 输出用于make系统的规则,该规则描述了源文件的依赖关系
  • -MM 生成源文件依赖关系,和-M类似,但不包含标准库的头文件
  • -MG 要求把缺失的头文件按存在对待,并且假定他们和源文件在同一目录下,必须和-M选项或-MM选项一起用
  • -MF 将依赖关系写入指定文件
  • -MD 等同于-M -MF,若给定-o选项,则输出文件名是-o指定的文件名,并添加.d后缀,若没有给定,则输入的文件名作为输出的文件名,并添加.d后缀。例gcc -E -o tmp.i -MD main.c,将生成tmp.d tmp.i
  • -MMD 类似于-MD,但是输出的依赖文件中,不包含标准头文件
  • -MP 生成的依赖文件里面,依赖规则中的所有.h依赖项都会在该文件中生成一个伪目标,其不依赖任何其他依赖项。防止在头文件被删除时构建失败
  • -MT 在生成的依赖文件中,指定依赖规则中的目标
gcc -M -MF main.d main.c

main.c文件内容:
#include <stdio.h>
int main(int argc,char** argv) {
    printf("hello,world\r\n");
    return 0;
}

main.d文件内容:
main.o: main.c /usr/include/stdc-predef.h /usr/include/stdio.h \
 /usr/include/x86_64-linux-gnu/bits/libc-header-start.h \
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \
 /usr/include/x86_64-linux-gnu/bits/long-double.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-linux-gnu/9/include/stddef.h \
 /usr/lib/gcc/x86_64-linux-gnu/9/include/stdarg.h \
 /usr/include/x86_64-linux-gnu/bits/types.h \
 /usr/include/x86_64-linux-gnu/bits/timesize.h \
 /usr/include/x86_64-linux-gnu/bits/typesizes.h \
 /usr/include/x86_64-linux-gnu/bits/time64.h \
 /usr/include/x86_64-linux-gnu/bits/types/__fpos_t.h \
 /usr/include/x86_64-linux-gnu/bits/types/__mbstate_t.h \
 /usr/include/x86_64-linux-gnu/bits/types/__fpos64_t.h \
 /usr/include/x86_64-linux-gnu/bits/types/__FILE.h \
 /usr/include/x86_64-linux-gnu/bits/types/FILE.h \
 /usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h \
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h

gcc -c -MM -MG  main.c -MP -MF main.d

main.c文件内容:
#include <stdio.h>
#include "defs.h"      // defs.h文件不存在
int main(int argc,char** argv) {
    printf("hello,world\r\n");
    return 0;
}

main.d文件内容:
main.o: main.c defs.h
defs.h:


gcc -MF main.d -MG -MM -MP -MT main.d -MT main.o main.c
main.d文件内容:
main.d main.o: main.c defs.h
defs.h:

以上介绍gcc中的-M的大部分选项,下面结合makefile,深入理解-M选项的作用。首次编译时生成依赖文件,后续编译过程中,当任何头文件发生更改,make系统通过*.d文件可反推,依赖该.h的源文件,仅重新编译目变文件。通过这种方式,-include $(DEPS)使得Makefile能够智能地管理文件依赖,简化构建过程,并避免手动管理依赖关系的麻烦。

Read more...

跨平台崩溃报告收集系统-breakpad

Breakpad是一个由Google开发的开源跨平台崩溃报告收集系统,主要作用是在程序崩溃时生成崩溃转储minidump文件,供开发者进行后续分析和调试。

breakpad

上图摘自官方文档,可以看出在开发者在构建系统中将调试信息从可执行文件中分离,分发给用户运行的是一个包含breakpad客户端的可执行文件,crash收集平台存储原始版本的调试信息及用户自动上传的minidumps文件。

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
export PATH=/path/to/depot_tools:$PATH
fetch breakpad && cd src
./configure && make && make check && make install

使用Breakpad捕获崩溃时,有两种常见的集成模式,进程内(崩溃处理逻辑运行在发生崩溃的同一进程中),进程外(崩溃捕获由另一个监控进程完成,发生崩溃的进程将信号或信息传递给守护进程,由后者写minidump)。下面通过两份简短的代码片段介绍,breakpad的使用方法和两种集成模式。

1.In-process崩溃收集


示例函数crash对空地址进行赋值导致进程coredump,在回调函数dump_callback中会自动将minidump文件上传至预设服务器对应的版本目录,供开发者分析崩溃原因

#include "client/linux/handler/exception_handler.h"
#include "common/linux/http_upload.h"

using google_breakpad::ExceptionHandler;
using google_breakpad::HTTPUpload;
using google_breakpad::MinidumpDescriptor;

static bool upload_minidump(const MinidumpDescriptor& descriptor) {
    std::map<string, string> parameters;
    std::map<string, string> files = {{"upload_file_minidump", descriptor.path()}};
    std::string url = "http://192.168.5.170:1127/post";

    parameters["prod"] = "test";
    parameters["ver"] = "0.1.3";

    std::string response, error;
    bool success = HTTPUpload::SendRequest(url, parameters, files, "", "", "", &response, NULL, &error);
    return success;
}

static bool dump_callback(const MinidumpDescriptor& descriptor, void* context, bool succeeded) {
    printf("Dump path: %s\n", descriptor.path());
    if (succeeded) upload_minidump(descriptor);
    return succeeded;
}

void crash() {
  volatile int *a = (int *)(NULL);
  *a = 1;
}

int main(int argc, char *argv[]) {
  MinidumpDescriptor descriptor("/tmp/test");
  ExceptionHandler eh(descriptor, NULL, dump_callback, NULL, true, -1);
  crash();
  return 0;
}

下面命令行展示如何编译breakpad程序,导出符号信息以及如何分析minidump文件将其转为coredump文件

Read more...
Previous Page 2 of 5 Next Page