gdb attach pid
Debug正在運行的程式
建立測試檔案
以下檔案每一秒印出1個數字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <unistd.h>
#include <cstring>
#include <iostream>
using namespace std;
void func2(const string msg) {
for (int i = 0; i < 1000000; i++) {
sleep(1);
cout << "i = " << i << endl;
}
}
void func1(const string msg) {
func2(msg);
}
int main() {
func1("test");
return 0;
}
執行以下程式
$ g++ -o demo03 core_test.cpp -g
$ ./demo03
ssh
遠端登入另一個終端機
ssh cici@192.168.235.128
ps -ef
列出跟demo03有關的process id
黃色標註就是demo03的pid
cici@cici-vm:~/test/app$ ps -ef |grep demo03
cici 27615 26646 0 10:01 pts/7 00:00:00 ./demo03
cici 27618 26755 0 10:02 pts/5 00:00:00 grep --color=auto demo03
sudo gdb -p
以user的身份執行以下指令
sudo gdb /home/cici/test/app/demo03 -p 27615
會發現正在運行的程式停住了,輸入q離開gdb,正在運行的程式繼續運作。
bt
列出呼叫函式的堆疊(call stack)
由下往上呼叫,最下面是main()呼叫func1(),func1()再呼叫func2(), func2()呼叫__sleep()
(gdb) bt
#0 0x0000702da76eca7a in __GI___clock_nanosleep (clock_id=clock_id@entry=0,
flags=flags@entry=0, req=req@entry=0x7ffdb28b2040,
rem=rem@entry=0x7ffdb28b2040)
at ../sysdeps/unix/sysv/linux/clock_nanosleep.c:78
#1 0x0000702da76f9a27 in __GI___nanosleep (req=req@entry=0x7ffdb28b2040,
rem=rem@entry=0x7ffdb28b2040) at ../sysdeps/unix/sysv/linux/nanosleep.c:25
#2 0x0000702da770ec63 in __sleep (seconds=0) at ../sysdeps/posix/sleep.c:55
#3 0x0000595ced2493ac in func2 (msg="test") at core_test.cpp:7
#4 0x0000595ced249437 in func1 (msg="test") at core_test.cpp:12
#5 0x0000595ced2494de in main () at core_test.cpp:15
set var
目前i = 282
i = 268
i = 269
i = 270
i = 271
i = 272
i = 273
i = 274
i = 275
i = 276
i = 277
i = 278
i = 279
i = 280
i = 281
i = 282
將執行時的變數修改成500,以下黃色則為要輸入的
(gdb) n 80 in ../sysdeps/unix/sysv/linux/clock_nanosleep.c (gdb) n 83 in ../sysdeps/unix/sysv/linux/clock_nanosleep.c (gdb) n __GI___nanosleep (req=req@entry=0x7ffdb28b2040, rem=rem@entry=0x7ffdb28b2040) at ../sysdeps/unix/sysv/linux/nanosleep.c:26 warning: 26 ../sysdeps/unix/sysv/linux/nanosleep.c: 沒有此一檔案或目錄 (gdb) n __sleep (seconds=0) at ../sysdeps/posix/sleep.c:62 warning: 62 ../sysdeps/posix/sleep.c: 沒有此一檔案或目錄 (gdb) n 64 in ../sysdeps/posix/sleep.c (gdb) n func2 (msg="test") at core_test.cpp:8 8 cout << "i = " << i << endl; (gdb) set var i=500 (gdb) n 6 for (int i = 0; i < 1000000; i++) { (gdb)
另一個視窗已經變成
i = 268
i = 269
i = 270
i = 271
i = 272
i = 273
i = 274
i = 275
i = 276
i = 277
i = 278
i = 279
i = 280
i = 281
i = 282
i = 500