日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GDB多进程调试(转)

發布時間:2025/4/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GDB多进程调试(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GDB 是 linux 系統上常用的 c/c++ 調試工具,功能十分強大。對于較為復雜的系統,比如多進程系統,如何使用 GDB 調試呢?考慮下面這個三進程系統:

進程?

Proc2 是 Proc1 的子進程,Proc3 又是 Proc2 的子進程。如何使用 GDB 調試 proc2 或者 proc3 呢?

實際上,GDB 沒有對多進程程序調試提供直接支持。例如,使用GDB調試某個進程,如果該進程fork了子進程,GDB會繼續調試該進程,子進程會不受干擾地運行下去。如果你事先在子進程代碼里設定了斷點,子進程會收到SIGTRAP信號并終止。那么該如何調試子進程呢?其實我們可以利用GDB的特點或者其他一些輔助手段來達到目的。此外,GDB 也在較新內核上加入一些多進程調試支持。

接下來我們詳細介紹幾種方法,分別是 follow-fork-mode 方法,attach 子進程方法和 GDB wrapper 方法。

follow-fork-mode

在2.5.60版Linux內核及以后,GDB對使用fork/vfork創建子進程的程序提供了follow-fork-mode選項來支持多進程調試。

follow-fork-mode的用法為:

set follow-fork-mode [parent|child]

· parent: fork之后繼續調試父進程,子進程不受影響。

· child: fork之后調試子進程,父進程不受影響。

因此如果需要調試子進程,在啟動gdb后:

(gdb) set follow-fork-mode child

?

并在子進程代碼設置斷點。

此外還有detach-on-fork參數,指示GDB在fork之后是否斷開(detach)某個進程的調試,或者都交由GDB控制:

set detach-on-fork [on|off]

?

· on: 斷開調試follow-fork-mode指定的進程。

· off: gdb將控制父進程和子進程。follow-fork-mode指定的進程將被調試,另一個進程置于暫停(suspended)狀態。

注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。

follow-fork-mode/detach-on-fork的使用還是比較簡單的,但由于其系統內核/gdb版本限制,我們只能在符合要求的系統上才能使用。而且,由于follow-fork-mode的調試必然是從父進程開始的,對于fork多次,以至于出現孫進程或曾孫進程的系統,例如上圖3進程系統,調試起來并不方便。

Attach子進程

眾所周知,GDB有附著(attach)到正在運行的進程的功能,即attach <pid>命令。因此我們可以利用該命令attach到子進程然后進行調試。

例如我們要調試某個進程RIM_Oracle_Agent.9i,首先得到該進程的pid

[root@tivf09 tianq]# ps -ef|grep RIM_Oracle_Agent.9i nobody 6722 6721 0 05:57 ? 00:00:00 RIM_Oracle_Agent.9i root 7541 27816 0 06:10 pts/3 00:00:00 grep -i rim_oracle_agent.9i



通過pstree可以看到,這是一個三進程系統,oserv是RIM_Oracle_prog的父進程,RIM_Oracle_prog又是RIM_Oracle_Agent.9i的父進程。
啟動GDB,attach到該進程

[root@tivf09 root]# pstree -H 6722



通過?pstree?察看進程?

用?GDB?連接進程?

現在就可以調試了。一個新的問題是,子進程一直在運行,attach上去后都不知道運行到哪里了。有沒有辦法解決呢?

一個辦法是,在要調試的子進程初始代碼中,比如main函數開始處,加入一段特殊代碼,使子進程在某個條件成立時便循環睡眠等待,attach到進程后在該代碼段后設上斷點,再把成立的條件取消,使代碼可以繼續執行下去。

至于這段代碼所采用的條件,看你的偏好了。比如我們可以檢查一個指定的環境變量的值,或者檢查一個特定的文件存不存在。以文件為例,其形式可以如下:

void debug_wait(char *tag_file) {while(1){if (tag_file存在)睡眠一段時間;elsebreak;} }



當attach到進程后,在該段代碼之后設上斷點,再把該文件刪除就OK了。當然你也可以采用其他的條件或形式,只要這個條件可以設置/檢測即可。

Attach進程方法還是很方便的,它能夠應付各種各樣復雜的進程系統,比如孫子/曾孫進程,比如守護進程(daemon process),唯一需要的就是加入一小段代碼。

GDB wrapper

很多時候,父進程 fork 出子進程,子進程會緊接著調用 exec族函數來執行新的代碼。對于這種情況,我們也可以使用gdb wrapper 方法。它的優點是不用添加額外代碼。

其基本原理是以gdb調用待執行代碼作為一個新的整體來被exec函數執行,使得待執行代碼始終處于gdb的控制中,這樣我們自然能夠調試該子進程代碼。

還是上面那個例子,RIM_Oracle_prog fork出子進程后將緊接著執行RIM_Oracle_Agent.9i的二進制代碼文件。我們將該文件重命名為RIM_Oracle_Agent.9i.binary,并新建一個名為RIM_Oracle_Agent.9i的shell腳本文件,其內容如下:

[root@tivf09 bin]# mv RIM_Oracle_Agent.9i RIM_Oracle_Agent.9i.binary [root@tivf09 bin]# cat RIM_Oracle_Agent.9i #!/bin/sh gdb RIM_Oracle_Agent.binary

當fork的子進程執行名為RIM_Oracle_Agent.9i的文件時,gdb會被首先啟動,使得要調試的代碼處于gdb控制之下。

新的問題來了。子進程是在gdb的控制下了,但還是不能調試:如何與gdb交互呢?我們必須以某種方式啟動gdb,以便能在某個窗口/終端與gdb交互。具體來說,可以使用xterm生成這個窗口。

xterm是X window系統下的模擬終端程序。比如我們在Linux桌面環境GNOME中敲入xterm命令:

xterm?

就會跳出一個終端窗口:

終端?

如果你是在一臺遠程linux服務器上調試,那么可以使用VNC(Virtual Network Computing) viewer從本地機器連接到服務器上使用xterm。在此之前,需要在你的本地機器上安裝VNC viewer,在服務器上安裝并啟動VNC server。大多數linux發行版都預裝了vnc-server軟件包,所以我們可以直接運行vncserver命令。注意,第一次運行vncserver時會提示輸入密碼,用作VNC viewer從客戶端連接時的密碼??梢栽赩NC server機器上使用vncpasswd命令修改密碼。

[root@tivf09 root]# vncserver New 'tivf09:1 (root)' desktop is tivf09:1 Starting applications specified in /root/.vnc/xstartup Log file is /root/.vnc/tivf09:1.log [root@tivf09 root]# [root@tivf09 root]# ps -ef|grep -i vnc root 19609 1 0 Jun05 ? 00:08:46 Xvnc :1 -desktop tivf09:1 (root) -httpd /usr/share/vnc/classes -auth /root/.Xauthority -geometry 1024x768 -depth 16 -rfbwait 30000 -rfbauth /root/.vnc/passwd -rfbport 5901 -pn root 19627 1 0 Jun05 ? 00:00:00 vncconfig -iconic root 12714 10599 0 01:23 pts/0 00:00:00 grep -i vnc [root@tivf09 root]#



Vncserver是一個Perl腳本,用來啟動Xvnc(X VNC server)。X client應用,比如xterm,VNC viewer都是和它通信的。如上所示,我們可以使用的DISPLAY值為tivf09:1。現在就可以從本地機器使用VNC viewer連接過去:

VNC viewer:輸入服務器?

輸入密碼:

VNC viewer:輸入密碼?

登錄成功,界面和服務器本地桌面上一樣:

VNC viewer?

下面我們來修改RIM_Oracle_Agent.9i腳本,使它看起來像下面這樣:

#!/bin/sh export DISPLAY=tivf09:1.0; xterm -e gdb RIM_Oracle_Agent.binary

如果你的程序在exec的時候還傳入了參數,可以改成:

#!/bin/sh export DISPLAY=tivf09:1.0; xterm -e gdb --args RIM_Oracle_Agent.binary $@

?

最后加上執行權限

[root@tivf09 bin]# chmod 755 RIM_Oracle_Agent.9i



現在就可以調試了。運行啟動子進程的程序:

[root@tivf09 root]# wrimtest -l 9i_linux Resource Type : RIM Resource Label : 9i_linux Host Name : tivf09 User Name : mdstatus Vendor : Oracle Database : rim Database Home : /data/oracle9i/920 Server ID : rim Instance Home : Instance Name : Opening Regular Session...

?

程序停住了。從VNC viewer中可以看到,一個新的gdb xterm窗口在服務器端打開了

gdb xterm?窗口?

[root@tivf09 root]# ps -ef|grep gdb nobody 24312 24311 0 04:30 ? 00:00:00 xterm -e gdb RIM_Oracle_Agent.binary nobody 24314 24312 0 04:30 pts/2 00:00:00 gdb RIM_Oracle_Agent.binary root 24326 10599 0 04:30 pts/0 00:00:00 grep gdb



運行的正是要調試的程序。設置好斷點,開始調試吧!

注意,下面的錯誤一般是權限的問題,使用 xhost 命令來修改權限:

xterm?錯誤?

[root@tivf09 bin]# export DISPLAY=tivf09:1.0 [root@tivf09 bin]# xhost + access control disabled, clients can connect from any host

?

xhost + 禁止了訪問控制,從任何機器都可以連接過來??紤]到安全問題,你也可以使用xhost + <你的機器名>。

小結

上述三種方法各有特點和優劣,因此適應于不同的場合和環境:

· follow-fork-mode方法:方便易用,對系統內核和GDB版本有限制,適合于較為簡單的多進程系統

· attach子進程方法:靈活強大,但需要添加額外代碼,適合于各種復雜情況,特別是守護進程

· GDB wrapper方法:專用于fork+exec模式,不用添加額外代碼,但需要X環境支持(xterm/VNC)。

?

轉自?http://www.ibm.com/developerworks/cn/linux/l-cn-gdbmp/

總結

以上是生活随笔為你收集整理的GDB多进程调试(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩在线视频一区二区三区 | 日韩激情精品 | 在线免费观看国产 | 福利在线播放 | 涩涩视频网站 | 牛牛av国产一区二区 | 成人av观看| 国产精品视频无码 | 97精品一区二区视频在线观看 | 麻豆激情视频 | 亚洲av中文无码乱人伦在线观看 | 日日躁夜夜躁狠狠躁 | 老地方在线观看免费动漫 | 免费黄网在线观看 | 国产高清不卡一区 | 五月婷婷爱爱 | 国产在线1区 | 九月婷婷丁香 | 天堂俺去俺来也www 欧美大片在线播放 | 成人黄色片在线观看 | 天堂bt在线| 国产欧美日韩三区 | 日本少妇裸体做爰 | аⅴ资源新版在线天堂 | 亚洲激情三区 | 人人做人人爱人人爽 | 久久久久久久一区二区三区 | 宅男av | 欧美乱插 | 真实人妻互换毛片视频 | 白丝校花扒腿让我c | 日本三级一区二区三区 | 久久久久久国产视频 | 日韩午夜精品视频 | 日韩欧美精品在线 | 激情国产在线 | 在线观看无码精品 | 华丽的外出在线 | 在线观看日批 | 亚洲视频大全 | 激情六月天 | jizz欧洲| 亚洲成av人在线观看 | 波多野一区二区三区 | 黄色成人免费视频 | 色综合图片 | 蜜桃久久久久久 | 亚洲 欧美 精品 | 国产欧美激情视频 | 婷婷色图 | 日韩极品视频在线观看 | 女女av在线 | 美女扒开内裤让男人桶 | 天堂在线视频免费 | 少妇精品久久久久www | 国产精品无 | 狠狠躁天天躁夜夜躁婷婷 | 欧美成人dvd在线视频 | 九九热中文字幕 | 91视频免费在线观看 | 国家队动漫免费观看在线观看晨光 | 91精品国产91久久久久久 | 伊人一区二区三区 | 米奇7777狠狠狠狠视频 | 最近中文字幕免费视频 | 亚洲乱熟 | 国产精品九色 | 伊人影视网 | 欧亚一区二区三区 | 午夜精品视频 | 亚洲精品网址 | 91在线观看喷潮 | 欧美一级色图 | 国产性猛交╳xxx乱大交 | 95在线视频 | 蜜桃在线一区二区三区 | 亚洲乱仑 | 中文字幕一区二区三区四区 | 性久久久| 亚洲国产精品成人综合色在线婷婷 | 精品久久久久久无码中文野结衣 | 中国亚洲老头同性gay男男… | 人妻天天爽夜夜爽一区二区三区 | 一本在线免费视频 | 欧美体内谢she精2性欧美 | 97国产成人无码精品久久久 | 欧美另类tv | 国产农村妇女精品一二区 | 天堂www中文在线资源 | 欧美日韩久久精品 | 欧美粗又大 | 亚洲在线一区二区三区 | 色啪视频 | 日本少妇bbwbbw精品 | 成人爱爱免费视频 | 亚洲欧美成人一区二区三区 | 免费一级特黄毛大片 | 久久精品成人一区二区三区蜜臀 | 天天操天天操天天操天天操 |