为什么mingw + gdb无法在sigsegv处理程序中正确显示回溯?

时间:2014-12-11 12:34:42

标签: c++ windows debugging gdb mingw

我正在调试从Windows上的gdb(mingw32)执行时运行速度非常慢的进程,因此我决定运行它直到它崩溃而没有gdb,然后附加调试器。我为sigsegv安装了一个显示其pid并等待的信号处理程序,所以当我看到消息时,我加载gdb并使用" attach"用那个pid命令。问题是gdb在那时向我展示了一个无用的回溯。这是一个例子:

void my_sigsegv_handler(int) {
    std::cerr << "Segmentation fault! pid=" << GetCurrentProcessId();
    std::cin.get(); // wait for gdb
}
int main() {
    signal(SIGSEGV,my_sigsegv_handler);
    int *p = 0;
    std::cout << *p; // boom!
}

使用&#34; mingw32-g ++ -g -O0&#34;编译,从gdb&#39; s命令输出&#34; bt&#34; (选择正确的线程后)是:

#0  0x764e73ea in ?? ()
#1  0x7646f489 in ?? ()
#2  0x75edc3b3 in ?? ()
#3  0x75edc2bc in ?? ()
#4  0x75edc472 in ?? ()
#5  0x00415502 in __gnu_cxx::stdio_sync_filebuf<char, std::char_traits<char> >::uflow() ()
#6  0x00434f32 in std::istream::get() ()
#7  0x004016d5 in my_sigsegv_handler () at C:\Users\usuario\zinjai\sin_titulo.cpp:8
#8  0x004010f9 in _gnu_exception_handler (exception_data=0x28fa88) at ../mingwrt-4.0.3-1-mingw32-src/src/libcrt/crt/crt1.c:137
#9  0x76469d57 in ?? ()
#10 0x77100727 in ?? ()
#11 0x770c9d45 in ?? ()
#12 0x00000000 in ?? ()

请注意,此示例在生成段错误时不会损坏堆栈。 Actualy,无论如何我都可以调试它,只是继续执行。如果我按下回车信号处理程序完成,返回到它生成的地方(主函数),问题没有解决,但这次gdb是抓住它。但我现在想它是如何运作的。

如果我在gnu / linux中使用相同的方法,我可以看到我想在这里看到的内容:

#5  0x00007f6809bf349e in std::istream::get() () from /usr/lib64/libstdc++.so.6
#6  0x00000000004008cd in my_signal_handler () at /home/zaskar/.zinjai/sin_titulo.cpp:6
#7  <signal handler called>
#8  0x00000000004008f9 in main (argc=1, argv=0x7fffa0613108) at /home/zaskar/.zinjai/sin_titulo.cpp:11

所以问题是,为什么gdb无法通过信号处理程序向我显示正确的回溯?或者我做错了什么?有没有更好的方法来解决它?

0 个答案:

没有答案