【发布时间】:2014-12-19 05:01:11
【问题描述】:
来自 Linux/gdb 世界,默认情况下,gdb 在检测到 SEGV 时会在默认处理程序清理进程之前中断程序的执行。
lldb 怎么做类似的伎俩?目前进程刚刚退出,无法查询回溯等。
编辑:proccess handle -p true -n true -s true 已尝试 - 没有结果 :(
(lldb) process handle -p true -n true -s true SIGSEGV
NAME PASS STOP NOTIFY
========== ===== ===== ======
SIGSEGV true true true
(lldb) run
Process 97630 launched: '/Volumes/My Finder Extensions 1/My_Daemon.app/Contents/PlugIns/My_ShellExt.appex/Contents/MacOS/My_ShellExt' (x86_64)
Process 97630 exited with status = 0 (0x00000000) Terminated due to signal 9
编辑:更多信息:
(lldb) bt all
error: invalid thread
我怀疑lldb 不能很好地处理损坏的堆栈 - 我正在尝试查找涉及_NSExtensionMain 入口点的问题,或者从那里开始的一些事情。
【问题讨论】:
-
您确定您的程序正在获得 SIGSEGV 吗?信号 9 是 SIGKILL,调试器无法捕捉到它(除非可能有一些特定于 Mach 的方法)。
-
这里发生了一些奇怪的事情。我们得到了进程的退出状态(0),所以它实际上正常退出了。不知道为什么我们也认为它得到了一个信号 9。顺便说一句,如果你正在调试一个程序并且它得到一个 SIGKILL,它将在调试器中停止,并带有 SIGKILL。调试器可以捕获 SIGKILL,它不能做的是抑制它们。
-
您可以尝试逐步调试吗?我认为您的程序会覆盖 IVT 或 PCB 等“敏感数据”的一部分,这可能就是您无法执行
backtrace的原因。 -
实际上,问题似乎是由于堆栈情况有些混乱(该错误在 Mach-O 入口点很早就出现了),是的,它是导致内存访问冲突的函数前导码 -甚至在安装应用程序的默认处理程序之前。因此 - 出口 0。
标签: debugging gdb lldb segmentation-fault