使用GDB去追glusterfs daemon有兩種方式.
- gdb模式下去launch glusterd daemon
- attach glusterfs deamon
以attach的方式attach glusterfs daemon:
假設glusterd的pid是22579
# gdb
# (gdb) attach 22579
因為通常glusterfs daemon launch 起來後, 會進入epoll dispatch. 所以我們直接在event_dispatch_epool_handler下break point
# (gdb) b event_dispatch_epoll_handler
直接在gdb mode下launch glsuterfs daemon
以glusterd為例
# gdb glusterd
我們直接在main下break point, 之後再一步一步追
# (gdb) b main
這一步就會開始 launch glusterd daemon, 並跑到main的break point
# (gdb) r -p /var/run/glusterd.pid
PS:
在gdb mode下launch glusterfs daemon時要注意一點, 因為是daemon.
在執行daemonize()的時候會fork出一個child process.
而之後的daemon都會由這個child process來執行, 包括進入epool dispatch.
所以再進入deamonize()之前要先輸入這個指令set follow-fork-mode child .
當他有fork出新的process的時候會自動切換到child process,
這樣我們就不用擔心會繼續留在parent process.
Set glusterfs client thread:
gluster vol set $vol event-threads 1
Trace glusterfs daemon 常用的gdb command:
backtrace: call flows: 進入fun
b: 設breakpoint
c: 跳到下一個breakpoint
finish: 跳出function
u: 跳到某行
set follow-fork-mode child: 有fork的話先切換到child
f: 確認現在位置
l: show code
set scheduler-locking on: 讓除了當前的thread能動 其他都是停只狀態
set var a=XXX: 改變變數值
沒有留言:
張貼留言