如何让valgrind与libsigsegv合作?

时间:2011-02-19 19:51:26

标签: segmentation-fault valgrind

this question about using libsigsegv to detect multiple stack overflows所述,我正在与一位同事一起尝试检测并从解释器中的堆栈溢出中恢复。简而言之,

  1. 我们使用libsigsegv设置堆栈溢出处理程序。
  2. 处理程序通过sigsegv_leave_handler()离开,然后通过siglongjmp返回解释程序的主循环。
  3. 此设置成功检测到第一个堆栈溢出,但第二个堆栈溢出导致总线错误。我想用valgrind来解决这个问题,但是valgrind接管第一个段错误。因此,我的问题是 如何让valgrindlibsigsegv处理第一个段错误,然后接管内存检查?

1 个答案:

答案 0 :(得分:1)

Valgrind是调试此问题的错误工具 - 您可能不会受到堆损坏(这是Valgrind擅长的),而是来自其他东西。

我会使用GDB来调试它。当您点击第一个SIGSEGV时,GDB将停止。您可以要求它使用(gdb) signal SIGSEGV将信号传递给应用程序,此时您的解释程序将执行siglongjmp。最终你会得到SIGBUS,并且可以调试你到达那里的方式。

由于您很可能在Linux上,请注意SIGBUS相当罕见,并且通常是因为尝试访问根本未映射或具有错误保护的内存。在/proc/<pid>/maps交付时检查SIGBUS可能会有所帮助。