1. 程式人生 > >Linux下GDB中的 attach pid 如何使用?

Linux下GDB中的 attach pid 如何使用?

linux下使用gdb可以很好的跟蹤程式碼。

當然,讓我覺得神奇的是它竟然能跟蹤正在執行的程序。

下面,我將用我的例子演示一下怎麼使用的。

第一步:獲得正在執行的程序的程序號

ps -ef | grep <程序名>

我的就是:

找到該程序的程序id,我的就是2486400, 下面根據這個程序號,attach到這個程序上去。

第二步: gdb attach <pid>

根據上一步獲得程序號,現在attach上去:

第三步:打斷點

gdb有兩種打斷點的方式:

1. gdb + 行號: 如果是當前檔案,則直接加上行號。gdb進入的不是當前檔案,則需要加上檔名。類似與相對路徑和絕對路徑

我的例子就是需要加上檔名,我需要在   /home/ceph/src/client/fuse_ll.cc 原始碼檔案中的 591行處打斷點,也就是fuse_ll_write函式入口:

(gdb) b /home/ceph/src/client/fuse_ll.cc:591
Breakpoint 1 at 0x556ae37be908: file /home/ceph/src/client/fuse_ll.cc, line 591.
(gdb) 

2. 第二種打斷點的方法是,gdb + 函式名,在我的例子裡,就是:

b /home/ceph/src/client/fuse_ll.cc:fuse_ll_write

這兩種打斷點的方法有一樣的效果。

第四步:觸發斷點

觸發斷點有很多情況,比如,輸入某個特定的值,刪除某個檔案,傳送某個程序的訊號。

在我這裡,是寫某個檔案:

可以看到,程序暫停了,沒有正確返回。

現在,我們去gdb去檢視是不是真的觸發了斷點,程序停到斷點處:

我們輸入c(continue的意思):

(gdb) c
Continuing.
[Switching to Thread 0x7f285e0a1700 (LWP 2486426)]

Thread 23 "ceph-fuse" hit Breakpoint 1, fuse_ll_write (req=0x556aed447780, ino=1099511627799, buf=0x556aed754050 "hello\n", size=6, off=0, fi=0x7f285e0a03c0)
    at /home/ceph/src/client/fuse_ll.cc:594
warning: Source file is more recent than executable.
594	  CephFuse::Handle *cfuse = fuse_ll_req_prepare(req);
(gdb) 

現在,我們就可以從斷點處追蹤程式了(輸入n或者s執行下一步,輸入n 進行下一步時會跳過函式,輸入s會進入每一個呼叫函式)。

大功告成!