在下面的示例代碼中,我們總共有四次異常調用,但是當我們使用優化標誌(-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;
}
Comiple上述代碼與優化參數(-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回溯中顯示的行號可能不正確。是否有可能知道中止呼叫是否被多次使用或者沒有看到源碼?如果我們知道該呼叫已被多次使用並進行了優化,那麼我們可以打印一條警告消息。我們是工具(內部使用gdb)提供程序,除了轉儲文件外,我們無法看到我們用戶的源代碼。
非常感謝您的幫助.. !!
如果你看不到源碼有什麼用的行號? –
我們只是工具提供商,並且證明了核心轉儲的回溯,我們應該確保該後援是正確的。但是由於源代碼的優化,我們不能得到確切的行數,所以我們想要給用戶打印一條警告消息。 –
相關:[gdb通過指向錯誤的代碼行顯示不正確的後臺跟蹤](http://stackoverflow.com/questions/33216397/gdb-showing-incorrect-back-trace-by-pointing-at-the-wrong - 行代碼) –