TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2012年5月12日 星期六

How to debug a program which grabs X11 input events

最近在做的抓圖程式, 因為要在非 focus 狀態也能接收到抓圖要求, 必須取得所有的輸入事件控制權.
但如果必須要在這種地方下中斷點, 因為 X11 所有的輸入都被搶走了, 你無法操作 gdb.
因此我只好用比較麻煩的方法. 假設有 X11 的電腦叫 A, 那我用另一台 B 電腦以 ssh 的方式連進去; A 先執行想 debug 的程式, B 查詢該程式的 pid, 再用 gdb attach 上去:
gdb -p <pid>
或是進入 gdb 之後
attach <pid>
attach 完成後, gdb 先幫你中斷所有的 event loop, 所以你可以先設定好中斷點, 再讓它 continue 下去.
有些程式會在 stderr 印出 debug 或 error 訊息, 但是 attach 並不會幫你把 fd 導到 gdb 所在的 tty, 如果你希望在 B 電腦看到這些訊息, gdb 也做得到.
首先你要知道 B 電腦目前所用的 shell 的 pid. 接著到 /proc/<pid>/fd 裡看 0, 1, 2 是 link 到哪一個 device. 它可能會看起來像這樣:
0 -> /dev/pts/6
1 -> /dev/pts/6
2 -> /dev/pts/6
接著在 gdb 內輪入:
p dup2(open("/dev/pts/6",1),2)
代表你把現在正在 debug 的程式的 stderr (fd 為 2) 導向到 /dev/pts/6. 如果它的回傳值不是負數, 就代表你成功了.

沒有留言:

張貼留言