2026/5/14 1:36:21
网站建设
项目流程
重庆做网站changeke,广州优化营商环境条例,2022百度搜索风云榜,智能科技网站模板现代计算环境中的高可用性程序崩溃监视与故障分析架构技术报告
1. 引言#xff1a;软件故障监控的工程挑战与理论基础
在现代复杂的软件生态系统中#xff0c;应用程序的稳定性#xff08;Stability#xff09;与可靠性#xff08;Reliability#xff09;构成了用户体验…现代计算环境中的高可用性程序崩溃监视与故障分析架构技术报告1. 引言软件故障监控的工程挑战与理论基础在现代复杂的软件生态系统中应用程序的稳定性Stability与可靠性Reliability构成了用户体验与系统安全的核心基石。尽管软件工程领域在静态代码分析、自动化测试以及形式化验证方面取得了长足进步但生产环境中的非确定性故障——通常被称为“海森堡Bug”Heisenbugs——依然不可避免。这些故障往往源于复杂的内存交互、竞态条件Race Conditions、硬件异常或操作系统状态的不可预测性。当这些异常状态超出程序的自我恢复能力时操作系统内核介入并强制终止进程执行这一过程即为“崩溃”Crash。构建一个能够精准捕获、记录并分析崩溃现场的监视系统不仅是软件维护的基本需求更是实现故障平均修复时间MTTR最小化的关键技术手段。本报告旨在详尽阐述在 Windows、Linux 和 macOS 三大主流操作系统平台上实现程序崩溃监视的底层原理、架构模式及工程实践。报告将超越表层的API调用深入剖析异常分发Exception Dispatching的内核机制探讨进程内In-Process与进程外Out-of-Process监视模型的安全性权衡并详细论述核心转储Core Dump与微型转储Minidump的数据工程。1.1 崩溃的本质与监控的必要性从操作系统内核的视角来看崩溃并非一种随机的混乱而是对不可恢复错误的有序响应。当 CPU 执行流水线检测到非法指令、无效内存访问或算术异常时会触发硬件中断控制权瞬间转移至内核态的中断处理程序。内核随即将此硬件异常映射为软件层面的异常信号如 Windows 的 SEH 异常或 POSIX 的 Signal并尝试将其分发给用户态进程进行处理。如果用户态进程未能妥善处理该异常内核将执行默认动作——通常是生成核心转储并终止进程。监视系统的核心任务在于“拦截”这一过程。在进程生命周期的最后毫秒内或者在进程外部观察其状态变化系统必须完成以下关键任务冻结现场暂停所有执行线程防止内存状态进一步恶化。上下文捕获读取 CPU 寄存器状态指令指针、栈指针、通用寄存器等。内存快照收集栈内存、堆内存片段以及加载模块列表。持久化将上述信息序列化为转储文件Dump File以便后续离线分析。1.2 报告结构本报告将按照由内而外、由底层机制到高层架构的逻辑展开。第二章将深入 Windows 操作系统的结构化与向量化异常处理机制第三章探讨 Linux 环境下的信号安全与核心转储管道技术第四章分析 macOS 双重异常处理模型的复杂性第五章对比进程内与进程外监视架构的优劣第六章论述看门狗机制与进程挂起检测最后探讨崩溃数据的后期处理与分析技术。—2. Windows 异常处理体系与监视实现Windows 操作系统提供了一套极为复杂且层次分明的异常处理架构主要由基于帧的结构化异常处理Structured Exception Handling, SEH和非基于帧的向量化异常处理Vectored Exception Handling, VEH组成。理解这两者的交互对于实现无死角的崩溃监视至关重要。2.1 结构化异常处理SEH的内核机制SEH 是 Windows 异常处理的基石它不仅服务于系统级异常如访问违规也是 C 异常处理try/catch和.NET 异常机制的底层实现基础。2.1.1 基于栈帧的链式结构 (x86 vs x64)在传统的 x86 (IA-32) 架构中SEH 的实现高度依赖于线程栈。每个线程的线程信息块Thread Information Block, TIB——通常通过 FS 段寄存器 (FS:) 访问——其第一个字段指向一个 _EXCEPTION_REGISTRATION_RECORD 链表的头部。每当代码进入一个 __try 块时编译器会在栈上构造一个新的注册记录并将其挂入链表前端。当异常发生时操作系统内核遍历该链表依次询问每个处理器是否愿意处理该异常EXCEPTION_CONTINUE_SEARCH 或 EXCEPTION_EXECUTE_HANDLER。然而这种基于栈的设计存在安全隐患如栈溢出攻击可覆盖异常处理指针。因此在 x64 架构中微软引入了基于表的异常处理模型。编译器不再在运行时动态生成栈记录而是在编译期生成静态的 UNWIND_INFO 表存储在可执行文件的 .pdata 段中。当异常发生时系统通过查找当前的指令指针RIP在表中的位置确定栈展开Unwind的路径和相应的处理器。这种机制不仅提高了非异常路径的性能还增强了安全性。2.1.2 UnhandledExceptionFilter最后的防线对于崩溃监视系统而言最关键的 SEH 组件是 UnhandledExceptionFilter (UEF)。当整个 SEH 链上的所有处理器都拒绝处理异常时系统会调用这个顶层过滤器。监视实现开发者通过 SetUnhandledExceptionFilter API 注册一个全局回调函数。该函数是进程崩溃前的最后执行机会。在此回调中监视系统通常会调用 MiniDumpWriteDump 将进程状态写入磁盘然后通知用户或重启进程。脆弱性分析尽管 UEF 设计用于捕获所有未处理异常但在实际工程中它极其脆弱。如果应用程序加载了某些第三方 DLL如早期的 CRT 版本这些 DLL 可能会在其内部的 DllMain 或线程入口中重置 UEF或者在捕获异常后直接终止进程而不传递给 UEF。此外如果崩溃是由严重的栈溢出Stack Overflow引起的栈空间可能不足以执行 UEF 的代码导致直接闪退。2.2 向量化异常处理VEH的全局监控优势为了弥补 SEH 基于栈帧的局限性Windows XP 引入了向量化异常处理VEH。VEH 不依赖于特定的函数调用栈而是与进程全局相关联。优先级机制VEH 处理器存储在一个全局链表中。当异常发生时在系统开始遍历 SEH 链表之前内核会优先调用注册的 VEH 处理器。这意味着 VEH 拥有“第一手”观察权。监视器设计利用 AddVectoredExceptionHandler API监视系统可以注册一个“首发”处理器。这使得监视器能够捕获那些被应用程序内部 __try/__except 块“吞噬”的异常。这对于调试极为有用但用于生产环境的崩溃上报时需要谨慎。因为 C 的 throw 语句底层也是通过 RaiseException 实现的VEH 会拦截到所有正常的 C 异常抛出。监视器必须通过检查异常代码如 0xE06D7363 是 Visual C 异常的魔数来过滤掉非致命异常否则会导致大量的误报。2.3 Windows Error Reporting (WER) 与外部集成除了自定义处理Windows 提供了操作系统级的崩溃收集机制——Windows Error Reporting (WER)。WerFault.exe当程序崩溃且未被调试器或自定义 UEF 拦截时系统会启动 WerFault.exe 进程。该进程负责生成转储、显示错误对话框并上传报告给微软。LocalDumps 配置通过注册表键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps管理员可以配置 WER 自动将崩溃转储保存到本地指定目录而无需编写任何代码。这对于无法修改源码的遗留系统监控至关重要。集成策略成熟的商业软件通常采取混合策略首先尝试在进程内通过自定义 UEF 生成包含特定元数据的 Minidump如果进程内处理失败如堆损坏导致死锁则回退依赖 WER 的机制。—3. Linux 平台下的信号机制与核心转储技术Linux 系统的异常处理机制深深植根于 UNIX 哲学主要依赖 POSIX 信号Signals进行内核与用户态的通信。与 Windows 的结构化异常不同Linux 的信号处理更接近底层的中断响应具有极高的灵活性但也伴随着极高的风险。3.1 关键崩溃信号的拦截与解析在 Linux 中崩溃监视器通过 sigaction 系统调用注册对特定信号的处理函数。以下信号是崩溃分析中必须捕获的“四大天王”信号描述触发场景是否生成 Core DumpSIGSEGV段错误 (Segmentation Fault)访问未映射的内存、写入只读内存、解引用空指针是SIGABRT中止 (Abort)调用 abort()、assert 失败、C std::terminate是SIGILL非法指令 (Illegal Instruction)执行无法识别的机器码、栈破坏导致跳转至数据段是SIGFPE浮点异常 (Floating Point Exception)除以零、整数溢出特定架构是3.1.1 扩展的上下文获取siginfo_t 与 ucontext_t传统的 signal() 函数仅提供信号编号这对于崩溃分析远远不够。现代监视器必须使用带有 SA_SIGINFO 标志的 sigaction。这使得信号处理函数接收三个参数signum信号编号。siginfo_t包含崩溃的详细元数据。例如对于 SIGSEGVinfo-si_addr 提供了导致崩溃的具体内存地址这对于判断是空指针解引用地址接近 0还是野指针访问至关重要。ucontext_t这是一个指向 ucontext_t 结构的指针包含了崩溃瞬间的 CPU 寄存器状态。在 x86_64 架构下可以通过 ucontext-uc_mcontext.gregs 获取指令指针通过 REG_RSP 获取栈指针。这些寄存器值是后续进行堆栈回溯Stack Walking的起点。3.2 异步信号安全Async-Signal-Safety的工程陷阱在 Linux 编写崩溃监视器面临的最大挑战是“异步信号安全”。当信号发生时主程序的执行流被强行中断转而执行信号处理函数。此时主程序可能正处于 malloc 的临界区并持有锁。死锁风险如果在信号处理函数中再次调用 malloc或任何内部调用 malloc 的函数如 printf, backtrace_symbols该函数会尝试再次获取堆锁导致死锁Deadlock。此时进程既无法继续运行也无法完成崩溃处理彻底挂死。安全子集POSIX 标准严格规定了在信号处理函数中只能调用一小部分系统调用如 write, open, _exit。绝大多数 C 标准库函数包括 stdio 库都是禁止使用的。工程解决方案预分配内存在程序启动阶段预先分配好用于存储崩溃报告的内存池避免在 Crash Handler 中动态分配。最小化逻辑Handler 仅负责将寄存器状态和极少量的栈数据写入预先打开的文件描述符然后立即退出或终止进程。跳板机制Handler 通过 fork或 clone派生子进程在子进程中执行复杂的操作如调用 GDB 或运行脚本因为子进程不受父进程锁状态的影响虽然 fork 本身在多线程程序中也存在局限性但在崩溃处理场景下通常是可接受的妥协。3.3 核心转储Core Dump的管道化处理Linux 内核提供了强大的核心转储机制能够将进程的内存镜像完整保存。除了简单的文件写入Linux 提供了一个极其灵活的机制core_pattern 管道。管道机制通过将 /proc/sys/kernel/core_pattern 的第一个字符设置为 |内核会将 Core Dump 的内容通过标准输入stdin流式传输给指定的后接用户空间程序。架构优势这实际上实现了一种原生的“进程外监视”。接收 Core Dump 的程序是一个全新的进程拥有干净的内存空间和完全的系统权限。它可以安全地解析数据、压缩上传而无需担心破坏崩溃进程的现场。这是 Ubuntu Apport 和 Systemd-coredump 的核心实现原理。3.4 堆栈回溯与模块解析为了让崩溃报告具有可读性必须将二进制地址映射为源代码位置。dl_iterate_phdr在 Linux 上动态链接库Shared Objects加载到内存中的基地址是随机的ASLR。监视器必须调用 dl_iterate_phdr 遍历加载的 ELF 对象列表记录每个模块的名称、基地址和内存大小。此函数虽然涉及锁但在大多数崩溃场景下仍被认为是获取内存映射图Memory Map的最佳途径。backtrace() 局限性Glibc 的 backtrace() 函数虽然方便但依赖于帧指针Frame Pointer且在信号上下文中不完全可靠。更健壮的方案通常涉及直接读取栈内存和解析 DWARF 调试信息但这通常由离线分析工具完成而非在崩溃现场实时进行。—4. macOS 平台下的双重异常处理机制macOS 的内核 XNU 结合了 Mach 微内核和 BSD 层这使得其异常处理机制具有独特的双重性。4.1 Mach 异常内核级的捕获在 macOS 和 iOS 上底层的硬件异常如 CPU 陷阱首先被 Mach 微内核捕获并转化为Mach 消息。异常端口Exception Ports每个任务Task即进程和线程都有与之关联的异常端口。通过 task_set_exception_ports API监视器可以将这些端口替换为自己创建的端口。RPC 通信当异常发生时内核向异常端口发送消息。监视线程通常运行在同一进程的独立线程或完全独立的进程中接收该消息挂起崩溃线程并读取其状态。优势Mach 异常处理发生在其被转换为 POSIX 信号之前。这意味着监视器可以捕获到最原始的异常信息甚至可以在应用层代码感知到错误之前进行干预。这是 Google Crashpad 在 macOS 上的首选机制。4.2 POSIX 信号BSD 层的兼容性如果 Mach 异常未被处理返回 KERN_FAILURE内核会将异常传递给 BSD 层转换为标准的 POSIX 信号如 SIGSEGV, SIGBUS投递给进程。EXC_CRASH 与 ReportCrashmacOS 系统自带的崩溃报告器ReportCrash监听了一种特殊的 Mach 异常 EXC_CRASH。这是系统在将未处理的 POSIX 信号转换为进程终止操作时生成的。如果应用层通过 sigaction 处理了信号但没有正确退出可能会导致系统生成两份报告或导致 ReportCrash 行为异常。Hardened Runtime 限制在现代 macOS 版本中启用了 Hardened Runtime 的进程受到严格限制。进程内监视器In-Process可能无法执行某些检查操作且 sigaction 上下文中的堆栈展开支持已被削弱系统库移除了部分 unwind info这使得进程外监视成为 macOS 上的唯一可靠选择。4.3 ARM64 架构下的上下文恢复随着 Apple Silicon 的普及ARM64 架构的崩溃分析变得至关重要。与 x86_64 不同ARM64 拥有大量的通用寄存器x0-x30。arm_thread_state64在 Mach 异常处理中通过 thread_get_state 获取 ARM_THREAD_STATE64 结构体。关键寄存器__pc (Program Counter)指令指针指向崩溃指令。__lr (Link Register, x30)存储函数返回地址用于重建调用栈的上一帧。__fp (Frame Pointer, x29)帧指针用于遍历栈帧链表。__sp (Stack Pointer)栈顶指针。红区Red ZoneARM64 ABI 规定栈指针下方 128 字节为红区编译器利用此区域优化叶子函数。监视器在处理栈数据时必须严格避开此区域以免破坏未保存的临时数据。—5. 监视架构模式对比与选择在理解了各 OS 的底层机制后架构师面临的核心决策是选择进程内In-Process还是进程外Out-of-Process监视模式。5.1 进程内监视In-Process轻量但脆弱架构监视代码作为动态库链接到主程序在主程序崩溃时直接在信号处理器或 UEF 中运行。适用场景资源受限的嵌入式设备、无法启动多进程的移动端系统如早期的 Android/iOS、对崩溃报告可靠性要求不高的场景。主要缺陷无法应对堆破坏Heap Corruption。一旦 malloc 元数据损坏监视器尝试分配内存生成报告时会引发二次崩溃导致“静默失败”。5.2 进程外监视Out-of-Process健壮的工业标准架构主程序启动时派生或连接到一个独立的 Handler 进程。Windows通过命名管道Named Pipe通信Handler 使用 ReadProcessMemory 读取崩溃进程内存。macOS通过 Mach Port 交换权限Handler 作为异常服务器接收内核消息。Linux通过 socketpair 连接Handler 可利用 ptrace 附着。优势内存隔离Handler 进程内存独立不受主程序崩溃影响。权限分离Handler 可以拥有不同的权限集用于上传数据。全能性Handler 可以捕获栈溢出等导致主进程无法执行任何代码的严重错误。代表实现Google Crashpad 和 Sentry Native SDK 默认采用此模式已成为桌面端应用的事实标准。—6. 看门狗Watchdog进程挂起与无响应监视崩溃监视通常关注的是“快速失败”但“进程挂起”Hang——即进程仍在运行但停止响应——对用户体验的破坏力同样巨大。看门狗机制用于检测此类故障。6.1 外部存活监控技术如何高效地从外部判断一个进程是否已经退出或僵死6.1.1 Linux: pidfd 与 epoll传统的 Linux 监控依赖 waitpid 或发送 0 信号探测但这存在 PID 复用PID Reuse的竞争条件风险。Linux 5.3 引入了 pidfd 机制。机制pidfd_open 返回一个文件描述符该描述符稳定地指向特定进程不受 PID 复用影响。实现将 pidfd 加入 epoll 监听 EPOLLIN 事件。当目标进程退出时内核触发事件。这是目前最高效、零轮询的监控方式。6.1.2 macOS: kqueue 与 NOTE_EXITmacOS 提供了 kqueue 事件通知机制。实现监视进程创建一个 kqueue并注册 EVFILT_PROC 过滤器指定目标 PID 和 NOTE_EXIT 标志。效果当目标进程退出时内核将事件放入队列唤醒监视进程无需轮询。6.1.3 Windows: 内核对象等待Windows 的进程句柄Handle本身就是同步对象。实现调用 WaitForSingleObject 等待目标进程句柄。当进程终止时句柄变为有信号状态Signaled。这种机制开销极低且完全可靠。6.2 内部心跳检测Heartbeat针对 UI 线程死锁进程未退出但无响应需要应用层配合。设计主线程在消息循环中定期更新一个原子变量时间戳。监控启动一个独立的 Watchdog 线程定期检查该时间戳。触发如果时间戳超过阈值如 30 秒未更新Watchdog 线程判定主线程卡死。此时Watchdog 线程可以主动调用 abort() 或构造异常强制触发崩溃处理流程从而生成包含死锁现场主线程停在锁等待处的转储文件。—7. 崩溃数据的工程化处理捕获崩溃只是第一步生成的转储文件必须具备足够的信息以便调试同时要符合隐私法规。7.1 转储文件格式与内容Minidump由微软定义并被广泛采用的格式。它不包含整个进程内存而是记录线程列表每个线程的 ID、优先级、TEB 地址。上下文每个线程的寄存器状态CONTEXT 结构。栈内存仅保存每个线程栈顶的一小部分内存如 4KB - 32KB足以重建调用栈和查看局部变量。模块列表所有加载的 DLL/SO 的路径、基地址、版本、时间戳和 UUID。7.2 模块识别与符号化流水线为了将十六进制地址还原为源代码行号必须建立严格的符号化Symbolication流水线。7.2.1 模块指纹 (Build ID / UUID)监视器在生成 Dump 时必须提取每个加载模块的唯一标识符。Linux (ELF)读取 .note.gnu.build-id 段。macOS (Mach-O)读取 LC_UUID 加载命令。Windows (PE)读取 PDB 签名 GUID。7.2.2 符号服务器调试时调试器WinDbg, GDB, LLDB或分析平台Sentry利用这些 ID 在符号服务器上查找匹配的调试文件.pdb,.dSYM,.debug。如果 ID 不匹配堆栈回溯将完全错误。7.3 数据隐私与脱敏 (Scrubbing)上传崩溃数据必须遵守 GDPR 等隐私法规。栈内存扫描由于 Minidump 包含栈内存其中可能残留密码、私钥或用户输入。高级监视器会在生成 Dump 后、上传前扫描栈内存将符合特定模式如信用卡号、Email 格式的数据覆写为零。路径清洗移除文件路径中的用户信息如将 /Users/john_doe/app 替换为 /Users/USER/app。—8. 结论程序崩溃监视系统的构建是一项复杂的系统工程它要求开发者深入理解操作系统底层的异常分发机制。架构选择对于高可靠性要求的企业级应用进程外Out-of-Process监视架构如 Crashpad 模式是唯一推荐的选择它能最大程度规避应用崩溃时的状态破坏。OS 适配必须针对不同 OS 采用原生机制——Windows 的 VEH/UEF 配合 MinidumpLinux 的信号处理配合 Core Pattern 管道macOS 的 Mach 异常端口。数据价值监视系统的价值不仅在于“捕获”更在于“解析”。完善的模块 ID 记录、符号化流水线和隐私脱敏机制是将原始二进制数据转化为可行动Actionable的工程洞察的关键。通过实施上述架构软件团队可以将“未知的崩溃”转化为“已知的问题”从而在复杂的计算环境中构建出真正具备韧性Resilience的软件系统。特性Windows (SEH/VEH)Linux (Signals)macOS (Mach/BSD)捕获机制UnhandledExceptionFilter, VEHsigaction (SIGSEGV, etc.)Mach Exception Ports, sigaction上下文获取EXCEPTION_POINTERSucontext_tthread_get_state (ARM64/x86)堆栈展开RtlCaptureStackBackTrace / StackWalk64libunwind / dl_iterate_phdrDWARF CFI / Compact Unwind进程外支持CreateRemoteThread / DebugActiveProcessptrace / core_pattern pipeMach RPC / task_for_pid挂起检测WaitForSingleObjectpidfd / epollkqueue / NOTE_EXIT引用的著作Microsoft-specific exception handling mechanisms - Wikipedia, 访问时间为 一月 5, 2026 https://en.wikipedia.org/wiki/Microsoft-specific_exception_handling_mechanismsLinux Coredumps (Part 1) Introduction | Interrupt - Memfault, 访问时间为 一月 5, 2026 https://interrupt.memfault.com/blog/linux-coredumps-part-1Structured Exception Handling (C/C) - Microsoft Learn, 访问时间为 一月 5, 2026 https://learn.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?viewmsvc-170cpp_tutorials/docs/generating_and_debugging_dump_file.md at master - GitHub, 访问时间为 一月 5, 2026 https://github.com/behnamasadi/cpp_tutorials/blob/master/docs/generating_and_debugging_dump_file.mdAbout Exceptions and Exception Handling - CrashRpt, 访问时间为 一月 5, 2026 https://crashrpt.sourceforge.net/docs/html/exception_handling.htmlException Handling in Windows - c - Stack Overflow, 访问时间为 一月 5, 2026 https://stackoverflow.com/questions/79122821/exception-handling-in-windowsCrash Dump Analysis - Win32 apps - Microsoft Learn, 访问时间为 一月 5, 2026 https://learn.microsoft.com/en-us/windows/win32/dxtecharts/crash-dump-analysisLinux core dump analysis - #embeddedbits, 访问时间为 一月 5, 2026 https://embeddedbits.org/linux-core-dump-analysis-embeddedbits/How to handle SIGABRT signal in unix - coredump - Stack Overflow, 访问时间为 一月 5, 2026 https://stackoverflow.com/questions/5867714/how-to-handle-sigabrt-signal-in-unixWhy rust program segfaults when panicabort? EDIT: its not SIGSEGV (segfault), its SIGABRT (abort signal) - Rust Users Forum, 访问时间为 一月 5, 2026 https://users.rust-lang.org/t/why-rust-program-segfaults-when-panic-abort-edit-its-not-sigsegv-segfault-its-sigabrt-abort-signal/86940X86 fpu registers in a signal handler’s ucontext, 访问时间为 一月 5, 2026 https://linux.kernel.narkive.com/9ykIkgMe/x86-fpu-registers-in-a-signal-handler-s-ucontextReading SSE registers (XMM, YMM) in a signal handler - Stack Overflow, 访问时间为 一月 5, 2026 https://stackoverflow.com/questions/43415882/reading-sse-registers-xmm-ymm-in-a-signal-handlerIs it possibly to get a stacktrace to file from a signal handler? - Kjellkod’s Blog, 访问时间为 一月 5, 2026 https://kjellkod.wordpress.com/2015/01/21/is-it-possibly-to-get-a-stacktrace-to-file-from-a-signal-handler/Making Linux C Crashes Less Chaotic - Robopenguins, 访问时间为 一月 5, 2026 https://www.robopenguins.com/less-crashy-crashes/How to get a stack trace for C using gcc with line number information? [duplicate], 访问时间为 一月 5, 2026 https://stackoverflow.com/questions/4636456/how-to-get-a-stack-trace-for-c-using-gcc-with-line-number-informationdl_iterate_phdr, 访问时间为 一月 5, 2026 https://refspecs.linuxbase.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/baselib-dl-iterate-phdr-1.htmldl_iterate_phdr(3) - Linux manual page - man7.org, 访问时间为 一月 5, 2026 https://man7.org/linux/man-pages/man3/dl_iterate_phdr.3.htmlGet list of loaded libraries in C on Linux (at runtime) - Stack Overflow, 访问时间为 一月 5, 2026 https://stackoverflow.com/questions/40832026/get-list-of-loaded-libraries-in-c-on-linux-at-runtimeHandling POSIX signals: how to get stack trace without using backtrace_symbols?, 访问时间为 一月 5, 2026 https://stackoverflow.com/questions/21282608/handling-posix-signals-how-to-get-stack-trace-without-using-backtrace-symbolsMach exceptions - Darling Docs, 访问时间为 一月 5, 2026 https://docs.darlinghq.org/internals/macos-specifics/mach-exceptions.htmlExceptional Behavior - fdiv.net, 访问时间为 一月 5, 2026 https://fdiv.net/2024/05/14/exceptional-behaviorHandling crashes on Mac OS X: ordering of Mach exceptions versus POSIX signals, 访问时间为 一月 5, 2026 http://lackingrhoticity.blogspot.com/2013/08/handling-crashes-on-mac-os-x.htmlBackend Tradeoffs | Sentry for Native, 访问时间为 一月 5, 2026 https://docs.sentry.io/platforms/native/advanced-usage/backend-tradeoffs/Writing ARM64 code for Apple platforms | Apple Developer Documentation, 访问时间为 一月 5, 2026 https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platformsCrashpad Overview Design, 访问时间为 一月 5, 2026 https://chromium.googlesource.com/crashpad/crashpad//HEAD/doc/overview_design.mdcrashpad/handler/crashpad_handler.md at backtrace - GitHub, 访问时间为 一月 5, 2026 https://github.com/backtrace-labs/crashpad/blob/backtrace/handler/crashpad_handler.mdclient/crashpad_client.h - crashpad/crashpad - Git at Google, 访问时间为 一月 5, 2026 https://chromium.googlesource.com/crashpad/crashpad//master/client/crashpad_client.hCrashpad | Sentry for Native, 访问时间为 一月 5, 2026 https://docs.sentry.io/platforms/native/configuration/backends/crashpad/pidfd_open(2) - Linux manual page - man7.org, 访问时间为 一月 5, 2026 https://man7.org/linux/man-pages/man2/pidfd_open.2.htmlepoll on pidfd - Dropbear, 访问时间为 一月 5, 2026 https://dropbear.xyz/2025/06/22/epoll-on-pidfd/Waiting on process exit, 访问时间为 一月 5, 2026 https://dxuuu.xyz/wait-pid.htmlMac OS X Manual Page For kqueue(2) - Apple Developer, 访问时间为 一月 5, 2026 https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/kqueue.2.htmlprocess/kill_mac.cc - chromium/src/base - Git at Google, 访问时间为 一月 5, 2026 https://chromium.googlesource.com/chromium/src/base//master/process/kill_mac.ccWaitForSingleObject function (synchapi.h) - Win32 apps | Microsoft Learn, 访问时间为 一月 5, 2026 https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-waitforsingleobjectProcess Watchdog - RIT Computing Security Blog, 访问时间为 一月 5, 2026 https://ritcsec.wordpress.com/2020/04/28/process-watchdog/Watchdog for a single process [Linux] [duplicate] - Stack Overflow, 访问时间为 一月 5, 2026 https://stackoverflow.com/questions/41018480/watchdog-for-a-single-process-linuxSentry for Minidumps, 访问时间为 一月 5, 2026 https://docs.sentry.io/platforms/native/guides/minidumps/Using Crash Minidump - CrashRpt, 访问时间为 一月 5, 2026 https://crashrpt.sourceforge.net/docs/html/using_minidump.htmlLoading Dynamic Libraries on Mac - Clark Kromenaker, 访问时间为 一月 5, 2026 https://clarkkromenaker.com/post/library-dynamic-loading-mac/Debug File Formats | Sentry for Google Crashpad, 访问时间为 一月 5, 2026 https://docs.sentry.io/platforms/native/guides/crashpad/data-management/debug-files/file-formats/