自动附加到SEGV和其他致命信号上的进程(panic_action)

时间:2014-02-27 14:01:16

标签: c unix gdb signals lldb

背景

最近在FreeRADIUS v3.0.x,v2.0.x和主分支机构中添加了支持'panic_action'的代码。

radiusd(主FreeRADIUS进程)收到致命信号(SIGFPE,SIGABRT,SIGSEGV等......)时,信号处理程序执行预定义的'panic_action',这是传递给{{的shell代码片段。 1}}。信号处理程序执行基本替换system()%e写入当前二进制名称和当前PID的值。

理论上,这应该允许像gdb或lldb这样的调试器附加到进程(%p),以执行交互式调试,或者自动收集回溯。这实际上适用于我的系统OSX 10.9.2 panic_action = lldb -f %e -p %p,但仅适用于lldb

问题

这似乎不适用于SIGABRT等其他信号。来自SIGSEGV的迷你回溯有效,但当execinfolldb附加到流程时,它们只会从信号处理程序获得回溯。

gdb似乎没有办法切换到任意帧地址。

有没有人知道是否有任何方法强制信号处理程序在与接收信号的线程相同的堆栈中执行?或者,当lldb附加回溯时,为什么不显示完整的堆栈。

实际输出如下:

lldb

代码

FATAL SIGNAL: Segmentation fault: 11 Backtrace of last 12 frames: 0 libfreeradius-radius.dylib 0x000000010cf1f00f fr_fault + 127 1 libsystem_platform.dylib 0x00007fff8b03e5aa _sigtramp + 26 2 radiusd 0x000000010ce7617f do_compile_modsingle + 3103 3 libfreeradius-server.dylib 0x000000010cef3780 fr_condition_walk + 48 4 radiusd 0x000000010ce7710f modcall_pass2 + 191 5 radiusd 0x000000010ce7713f modcall_pass2 + 239 6 radiusd 0x000000010ce7078d virtual_servers_load + 685 7 radiusd 0x000000010ce71df1 setup_modules + 1633 8 radiusd 0x000000010ce6daae read_mainconfig + 2526 9 radiusd 0x000000010ce78fe6 main + 1798 10 libdyld.dylib 0x00007fff8580a5fd start + 1 11 ??? 0x0000000000000002 0x0 + 2 Calling: lldb -f /usr/local/freeradius/sbin/radiusd -p 1397 Current executable set to '/usr/local/freeradius/sbin/radiusd' (x86_64). Attaching to process with: process attach -p 1397 Process 1397 stopped (lldb) bt error: libfreeradius-radius.dylib debug map object file '/Users/arr2036/Documents/Repositories/freeradius-server-fork/build/objs//Users/arr2036/Documents/Repositories/freeradius-server-master/src/lib/debug.o' has changed (actual time is 0x530f3d21, debug map time is 0x530f37a5) since this executable was linked, file will be ignored * thread #1: tid = 0x8d824, 0x00007fff867fee38 libsystem_kernel.dylib`wait4 + 8, queue = 'com.apple.main-thread, stop reason = signal SIGSTOP frame #0: 0x00007fff867fee38 libsystem_kernel.dylib`wait4 + 8 frame #1: 0x00007fff82869090 libsystem_c.dylib`system + 425 frame #2: 0x000000010cf1f2e1 libfreeradius-radius.dylib`fr_fault + 849 frame #3: 0x00007fff8b03e5aa libsystem_platform.dylib`_sigtramp + 26 (lldb) 的相关代码位于:https://github.com/FreeRADIUS/freeradius-server/blob/b7ec8c37c7204accbce4be4de5013397ab662ea3/src/lib/debug.c#L227

fr_fault()用于设置信号处理程序的函数位于:https://github.com/FreeRADIUS/freeradius-server/blob/0cf0e88704228e8eac2948086e2ba2f4d17a5171/src/lib/misc.c#L61

由于链接包含提交哈希值,因此代码应为静态

修改 最后,对于OSX 10.10.4上的lldb-330.0.48版本,lldb现在可以通过_sigtram。

fr_set_signal()

1 个答案:

答案 0 :(得分:2)

这是lldb中与通过_sigtramp(用户进程中的异步信号处理程序)进行回溯相关的错误。不幸的是,我无法为此问题建议解决方法。如果您愿意从源代码构建(参见“源”和“构建”侧栏),它已在http://lldb.llvm.org/的lldb树源中修复。但是,Xcode 5.0和下一个版本的发布会在_sigtramp之后回过头来解决实际问题。