我正在 Mac OSX 上编写一个程序,依赖于 sigaction/sa_handler 机制。运行用户的代码片段并随时准备捕获信号/异常。程序工作良好,但问题是我无法使用 lldb 进行调试。即使我设置了忽略任何异常,lldb 似乎也无法忽略。
proc hand -p true -s false SIGSEGV
proc hand -p true -s false SIGBUS
即使尝试使用命令c,控制流程也会在触发异常的指令处停止,并且不会跳转到我之前安装的sa_handler
。输出结果为:
Process 764 stopped
* thread #2: tid = 0xf140, 0x00000001000b8000, stop reason = EXC_BAD_ACCESS (code=2, address=0x1000b8000)
我该如何让lldb忽略异常/信号,使程序的sa_handler起作用?
编辑:示例代码
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>
static void handler(int signo, siginfo_t *sigaction, void *context)
{
printf("in handler.\n");
signal(signo, SIG_DFL);
}
static void gen_exception()
{
printf("gen_exception in.\n");
*(int *)0 = 0;
printf("gen_exception out.\n");
}
void *gen_exception_thread(void *parg)
{
gen_exception();
return 0;
}
int main()
{
struct sigaction sa;
sa.sa_sigaction = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
if(sigaction(/*SIGBUS*/SIGSEGV, &sa, NULL) == -1) {
printf("sigaction fails.\n");
return 0;
}
pthread_t id;
pthread_create(&id, NULL, gen_exception_thread, NULL);
pthread_join(id, NULL);
return 0;
}
tools/debugserver/source/MacOSX/MachTask.mm
文件在哪里? - Ash