Skip to main content

多进程接入

Windows 多进程环境接入SDK

目前 Bugly Windows 为独立进程架构:业务进程拉起 crashpad_handler.exe 。等发生crash的时候再通知crashpad_handler.exe生成dmp文件并上报。并且crashpad_handler.exe支持多个客户进程通过named pipe连接到他。主要的两个接口如下:

client_extension.dll 包含crashpad_handler.exe 包含
shared section:PipeNameNamedPipe Handler
注册ExceptionHanderWaiting CrashEvent
CrashEventGen Minidump
noneupload minidump

宿主进程调用InitBuglyManager:

  1. 生成随机的PipeName并存入SharedSection中(所有dll实例共用)
  2. 使用PipeName创建NamedPipe,保存PipeHandler
  3. 拉起crashpad_handler.exe,并将PipeHandler传给crashpad_handler.exe,然后关闭自己这边的PipeHandler
  4. 注册异常监控函数
  5. 监控到异常后,激活CrashEvent事件,通知crashpad_handler.exe读取宿主进程生成minidump并上传
  6. 调用InitBuglyManager的进程退出时,crashpad_handler.exe才会退出

宿主进程调用SetHandlerIPCPipe(pipe_name):

  1. 宿主进程CrashFile打开NamedPipe,并发送register消息
  2. crashpad_handler.exe收到register消息后,获取发送方的processId,并生成新的CrashEvent和processId关联,再将CrashEvent回传给对方
  3. 宿主进程接收到CrashEvent后保存,并注册异常监控函数
  4. 监控到异常后,激活CrashEvent事件,通知crashpad_handler.exe读取宿主进程生成minidump并上传

总结:

如果业务是多进程架构,且只需要一个crashpad_handler.exe ,只需要在初始进程中调用一次InitBuglyManager函数拉起crashpad_handler.exe 然后其他的进程调用SetHandlerIPCPipe方法就行了。

如果需要每个进程都有自己的crashpad_handler.exe,就每个进程都单独调用InitBuglyManager,然后马上调用GetHandlerIPCPipeName将自己的pipename保存起来,后续使用SetKey(pipeName, key, value)来设置自己的crashpad_handler.exe