2014年12月15日 星期一

GDB with GlsuterFS


使用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 flow
s: 進入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: 改變變數值

 

沒有留言:

張貼留言