Linux下GDB中的 attach pid 如何使用?
阿新 • • 發佈:2019-01-14
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會進入每一個呼叫函式)。
大功告成!