macos - 如何让lldb忽略EXC_BAD_ACCESS异常?

标签 macos signals lldb

我正在 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;
}

最佳答案

我在最近的一个项目中需要这个,所以我只是构建了自己的 LLDB。我在 tools/debugserver/source/MacOSX/MachTask.mm 中修补了一行

err = ::task_set_exception_ports (task, m_exc_port_info.mask, m_exception_port, EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES, THREAD_STATE_NONE);

err = ::task_set_exception_ports (task, m_exc_port_info.mask & ~EXC_MASK_BAD_ACCESS, m_exception_port, EXCEPTION_DEFAULT | MACH_EXCEPTION_CODES, THREAD_STATE_NONE);

这会导致调试服务器无法捕获EXC_BAD_ACCESS异常。现在,我的自定义 LLDB 工作得很好:它仍然捕获 SIGSEGVSIGBUS,但在面对 EXC_BAD_ACCESS 时不再进入愚蠢的无限循环。在之前的致命信号上设置进程句柄选项也可以正常工作,而且我现在可以不受惩罚地调试SEGV处理程序。

Apple 确实应该在 LLDB 中将此作为一个选项......对他们来说似乎是一个非常简单的解决方案。

关于macos - 如何让lldb忽略EXC_BAD_ACCESS异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26829119/

相关文章:

swift - 无法处理全屏 NSWindow 中的按键事件

C++ 多重继承和 Objective-C。这是 GCC 中的错误吗?

c++ - 启动调试 session 时 MacOS 上的 VSCode LLDB 错误

macos - LLDB错误:无法将断点解析为任何实际位置

qt - LLDB 数据格式化程序可以调用方法吗?

c++ - 用于 C/C++ 开发的 Mac 与 Ubuntu?

c++ - 用 C++ 编写 Mac OS X 应用程序的完整解决方案

c - 是否可以同时使用自定义 sigaction 信号处理程序和 pthread_sigmask?

python - 将信号处理委托(delegate)给 python 中的子进程

c - 如何从 C 中的信号处理程序获取返回值?