如何让lldb忽略EXC_BAD_ACCESS异常?

2023-11-25

我正在 Mac OSX 上根据 sigaction/sa_handler 机制编写一个程序。运行用户的代码片段并准备随时捕获信号/异常。该程序工作正常,但问题是我无法使用 lldb 对其进行调试。即使我设置了 lldb 似乎也无法忽略任何异常

proc hand -p true -s false SIGSEGV 
proc hand -p true -s false SIGBUS

控制流停止在触发异常的指令处,即使我尝试了命令,也不会跳转到我之前安装的 sa_handlerc。输出是:

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 from

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

to

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 工作得很好:它仍然捕获SIGSEGV and SIGBUS但在面对时不再进入愚蠢的无限循环EXC_BAD_ACCESS。环境process handle以前致命信号上的选项也工作得很好,我现在可以毫无顾忌地调试 SEGV 处理程序。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让lldb忽略EXC_BAD_ACCESS异常? 的相关文章

随机推荐

  • VBA 中的评估()

    您好 欢迎来到评价 mystery The MSDN Office Developer Reference 2013 Documentation says 使用方括号 例如 A1 C5 与调用相同 带有字符串参数的 Evaluate 方法
  • Google 文档查看器不适用于 Amazon s3 签名的网址

    借助 google doc 查看器 api 我尝试在 iframe 内显示存储在 S3 存储桶上的 doc 文件 我已经做了一些研究并发现this 我尝试在这里应用 var encodedUrl encodeURIComponent htt
  • 当成员是 unique_ptr 时删除了复制构造函数[重复]

    这个问题在这里已经有答案了 这段代码工作正常 class Test int ptr new int 10 int main Test o Test t o 但是当我们使用 unique ptr 而不是 raw ptr 时 我们会得到一个错误
  • Minikube 从未启动 - 重新启动集群时出错

    我正在使用 Arch Linux我安装了 virtualbox 5 2 12我安装了 minikube 0 27 0 1我安装了 Kubernetes v1 10 0 当我尝试启动 minikube 时sudo minikube start
  • 如何将未转义的 XML 写入 XMLStreamWriter?

    我有许多小的 XML 块 它们应该作为子元素嵌入到一个大的 XML 中 有什么办法可以将这些块写入XMLStreamWriter不逃避他们 以下是处理此问题的几个选项 选项 1 使用javax xml transform Transform
  • 使用 vector::iterator 或 at() 迭代 STL 向量哪个更快?

    就性能而言 什么会运行得更快 有区别吗 它依赖于平台吗 1 Using vector
  • 更改 ckEditor 的背景颜色

    我需要使用 ckEditor 在加载时动态更改背景颜色 它所在的页面是一个动态加载页面 用户在其中具有特定的背景颜色 我无法加载 css 它必须只是编辑器主体背景颜色 所以我尝试了 window onload function CKEDIT
  • 获取 Angular 2 路由器中当前路由组件的引用?

    有没有一种干净的方法来获取当前路由组件的引用 这似乎有效 但看起来很老套 this router currentInstruction component componentType prototype somePropertyOrFunc
  • Android 应用程序包上传在 Firebase 身份验证中创建奇怪的帐户(<字符>.<5 位数字>@gmail.com)

    我有一个使用 Flutter 的 Android 应用程序 应用程序后端是 Firebase 每次我将应用程序包上传到 Play 商店控制台时 有人 某些系统 会在我的 Firebase 项目中创建奇怪的用户帐户 他们很奇怪 因为电子邮件格
  • SIGINT 取消 bash 脚本中的读取?

    我正在编写一个 bash 包装器来学习一些脚本概念 这个想法是在 bash 中编写一个脚本 并在登录时将其设置为用户的 shell 我做了一个 while 循环reads and evals 用户的输入 然后注意到 每当用户键入CTRL C
  • mysql_upgrade - 致命错误:升级失败

    我最近将 MySQL 服务器从 5 1 升级到 5 5 并且我尝试使用 mysql upgrade 升级我的数据库 但我不断收到此错误 root ip mysql upgrade uadmin p Enter password Lookin
  • 应用程序处于后台状态时的 CLLocationManager

    我的问题是 当我的应用程序处于非活动状态时 CLLocationManager 是否继续运行 Yes if CLLocationManager首先被称为startUpdatingLocation方法 并且在AppName Info plis
  • SVG 到 PNG 文本无法正确显示 - Arial 字体

    我遇到一个问题 当存在具有不同字体系列的文本 如 Arial 时 使用 Apache Batik 转换的 PNG 会有所不同 该问题发生在 Cent OS 6 运行 Tomcat 7 和 Java 6 的环境中 用于将 SVG 转换为 PN
  • 杀死名称以特定字符串开头的缓冲区

    这是我的问题 我使用 Emacs 并获得大量一直毫无用处的缓冲区 例如 Messages 或 Completions 我想绑定 C y 来关闭所有以 开头的缓冲区 除了 shell 和 shell 缓冲区 为此 我想在 emacs 文件中添
  • 输入元素上的 JavaScript 更改事件仅在失去焦点时触发

    我有一个输入元素 我想继续检查内容的长度 每当长度等于特定大小时 我想启用提交按钮 但我面临着 Javascript 的 onchange 事件作为事件的问题仅当输入元素超出范围时触发 而不是在内容更改时触发
  • PhpStorm:SCSS 文件观察器设置

    我需要帮助在 PhpStorm 中设置我的 SCSS 文件观察器 我使用的是 Ubuntu 我有 PhpStorm 6 我有带有 Ruby 1 9 3p194 和 Sass 3 2 5 的 RVM 我已在设置 gt gt 文件观察器中设置文
  • 中断处理程序中的 C printf()?

    I heard printf C 中的内容不应在 ISR 中使用 是因为它是阻塞调用 还是因为它不可重入 If printf 不是可重入的 那么这是否意味着它也不能用于多线程程序 除非它以某种方式 同步 我认为可能是所有这些 甚至更多 典型
  • 如何在 Blazor 中模拟 setTimeout()?

    我正在尝试在 Blazor 中复制一个简单的 JS 方法 这个想法是type out给定单词 句子 等中的每个字符 W3学校有一个很好的例子 说明了如何快速完成此操作 那么 给出他们的示例 如何在 C 和 JS 中做同样的事情呢 var i
  • 使用剪贴板管理器在 Android 中复制粘贴图像

    我想使用剪贴板管理器将图像从我的 Android 应用程序复制到其他 Android 应用程序 我做了很多研究并阅读了this教程 但不包括图像复制部分 下面的代码复制图像 但当我尝试粘贴时 仅粘贴图像的路径 ContentValues v
  • 如何让lldb忽略EXC_BAD_ACCESS异常?

    我正在 Mac OSX 上根据 sigaction sa handler 机制编写一个程序 运行用户的代码片段并准备随时捕获信号 异常 该程序工作正常 但问题是我无法使用 lldb 对其进行调试 即使我设置了 lldb 似乎也无法忽略任何异