[GDB] 在程式碼中使用 signal() 插入中斷點,讓 GDB 暫停程式做 debugging
今天想要用 gdb debug 一個程式,看看某個變數的值,
平常可能可以用 gdb 的中斷點,但有時候想要在某些情況下,才讓 gdb 停在特定地方~
gdb 應該有支援條件式的中斷點,不過另一種方法是直接在程式碼裡喚醒 gdb,
這種方法有時候可以很精準的貼近要 debug 的位置,也算是蠻實用的技巧囉~
查了一下,一般常用的是產生一個 SIGINT 中斷,讓 gdb 去攔,
或者是用 asm 指令直接下一個 int 3 的中斷,gdb 一樣會攔到~
舉例來說,我們在下面的程式碼裡面,呼叫了 raise(SIGINT),產生一個 SIGINT 的中斷:
#include <stdio.h> #include <signal.h> int main() { raise(SIGINT); int a = 0, b = 1; printf("a=%d, b=%d\n", a, b); return 0; }
當用 gdb 執行這個程式,跑到 raise(SIGINT) 的地方時,
產生的 SIGINT 中斷就會被 gdb 攔截到:
(gdb) run Starting program: /var/app_data/U-Sandbox/u-sandbox/./a.out Program received signal SIGINT, Interrupt. 0x00007ffff72305d7 in raise () from /lib64/libc.so.6 Missing separate debuginfos, use: debuginfo-install glibc-2.17-78.el7.centos.1.x86_64
這時 gdb 就已經將程式暫停下來了,不管是要單步執行、檢查變數值都沒問題囉~
(gdb) n Single stepping until exit from function raise, which has no line number information. main () at test.cpp:7 7 int a = 0, b = 1;
參考資料:
stackoverflow: Set breakpoint in C or C++ code programmatically for gdb on Linux
How to programmatically break into gdb from gcc C++ source
(本頁面已被瀏覽過 392 次)