【发布时间】:2016-01-17 22:00:33
【问题描述】:
我们可以通过在源代码中调用多个 abort 来通过非常简单的示例重现此问题。在下面的示例代码中,我们总共有四个不同条件的中止调用,但是当我们使用优化标志(-O3)进行编译时,我们只能看到一个中止调用的调试信息。因此,在这四个中止调用中发生崩溃的地方,gdb 总是给出具有调试信息的那个。
#include <stdio.h>
#include <stdlib.h>
void level_aa(int a)
{
if (a == 0)
abort();
if (a == 1)
abort();
if (a == 2)
abort();
abort();
}
int main(int argc,char *argv[])
{ int D;
D = atoi(argv[1]);
printf(" Value = %d", D);
level_aa(D);
return 0;
}
使用优化标志 (-O3) 编译上述代码并使用 gdb 运行以重现问题。
>gcc -g -O3 abort_crash.c -o abort
>gdb ./abort
(gdb)run 1
(gdb) bt
#0 0x00007ffff7ab2945 in *__GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1 0x00007ffff7ab3f21 in *__GI_abort () at abort.c:92
#2 0x0000000000400634 in level_aa (a=<optimized out>) at abort_crash.c:13
#3 main (argc=<optimized out>, argv=<optimized out>) at abort_crash.c:20
(gdb)
如果我们观察帧 2(#2),崩溃实际上发生在第 9 行,但 gdb 显示第 13 行。我可以理解这是由于源代码的优化而发生的。 在这种情况下是否可以使 gdb 正常工作? (不删除优化) 在此先感谢您的帮助。
【问题讨论】:
-
不一定,你应该说 waht 是有这个问题的 gdb 的确切版本。还有 gcc 和 binutils 的确切版本。什么平台以及在 Linux 的情况下是哪个发行版。
标签: c gcc optimization gdb abort