最近在做的抓圖程式, 因為要在非 focus 狀態也能接收到抓圖要求, 必須取得所有的輸入事件控制權.
但如果必須要在這種地方下中斷點, 因為 X11 所有的輸入都被搶走了, 你無法操作 gdb.
但如果必須要在這種地方下中斷點, 因為 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. 接著到
首先你要知道 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. 如果它的回傳值不是負數, 就代表你成功了.
沒有留言:
張貼留言