【问题标题】:Valgrind: Deliberately cause segfaultValgrind:故意造成段错误
【发布时间】:2010-12-08 05:56:15
【问题描述】:

这是一个 mad-hack,但我试图在执行的特定点故意导致段错误,因此 valgrind 会给我一个堆栈跟踪。

如果有更好的方法可以做到这一点,请告诉我,但我仍然很想知道如何故意造成段错误,以及为什么我的尝试没有奏效。

这是我失败的尝试:

long* ptr = (long *)0xF0000000;
ptr = 10;

我认为 valgrind 至少应该将其视为无效写入,即使它不是分段违规。 Valgrind 对此只字未提。

有什么想法吗?

编辑

答案已被接受,但我仍然对任何关于获取堆栈跟踪的更理智的方法的建议表示赞成...

【问题讨论】:

标签: c segmentation-fault valgrind


【解决方案1】:

您是否缺少* 中的*ptr = 10?你所拥有的不会编译。

如果确实如此,那当然不会导致段错误,因为您只是分配了一个数字。取消引用可能。

假设在您的操作系统上取消引用 null 会导致段错误,以下应该可以解决问题:

inline void seg_fault(void)
{
    volatile int *p = reinterpret_cast<volatile int*>(0);
    *p = 0x1337D00D;
}

【讨论】:

  • * 紧挨着类型“long*”
  • 我还没有决定我喜欢哪种形式——“long* ptr”、“long *ptr”、“long * ptr”
  • 那是怎么编译的呢?你用的是什么编译器?
【解决方案2】:

你在 x86 上吗?如果是这样,那么实际上在 CPU 中有一个操作码,意思是“调用任何可能附加的调试器”。这是操作码CC,或更通常称为int 3。触发它的最简单方法是使用内联汇编:

inline void debugger_halt(void)
{
#ifdef MSVC
   __asm int 3;
#elif defined(GCC)
   asm("int 3");
#else
#pragma error Well, you'll have to figure out how to do inline assembly 
              in your compiler
#endif
}

MSVC 还支持__debugbreak(),这是非托管代码中的硬件中断和托管代码中的 MSIL“中断”。

【讨论】:

    【解决方案3】:

    向进程发送 sig SEGV (11) 以强制进行核心转储不是更好吗?

    【讨论】:

    • 通常,您无法从进程外部知道执行期间的确切时间点(您希望在该点发送 SIGSEGV)。
    • 进程可以向自己发送SIGSEGV:kill(getpid(), SIGSEGV);
    【解决方案4】:

    很抱歉提到了显而易见的问题,但为什么不使用带断点的 gdb 然后使用回溯呢?

    (gdb) b somewhere
    (gdb) r
    (gdb) bt
    

    【讨论】:

    • 这就是我的想法,但我在 gdb 上的经验不足,不知道如何操作。 :)
    【解决方案5】:

    只需致电abort()。这不是段错误,但它应该生成核心转储。

    【讨论】:

      【解决方案6】:

      正如其他答案中提到的,如果您想完全异常终止您的程序,您可以调用abort(),如果必须是分段错误,则可以调用kill(getpid(), SIGSEGV)。这将生成一个核心文件,即使您没有在 valgrind 下运行,您也可以将其与 gdb 一起使用以获取堆栈跟踪或调试。

      使用 valgrind client request 您还可以让 valgrind 使用您自己的自定义消息转储堆栈跟踪,然后继续执行。当程序不在 valgrind 下运行时,客户端请求什么也不做。

      #include <valgrind/valgrind.h>
      ...
      VALGRIND_PRINTF_BACKTRACE("Encountered the foobar problem, x=%d, y=%d\n", x, y);
      

      【讨论】:

        猜你喜欢
        • 2014-11-19
        • 2015-09-25
        • 2013-07-25
        • 2017-10-17
        • 2014-12-12
        • 1970-01-01
        • 2013-01-22
        • 1970-01-01
        相关资源
        最近更新 更多