如何使用gdb调试多进程 如何用gdb调试fork出来的子进程

Linux\uff1a\u5982\u4f55\u4f7f\u7528gdb\u8c03\u8bd5\u591a\u8fdb\u7a0b\u591a\u7ebf\u7a0b\u7a0b\u5e8f

follow-fork-mode
\u57282.5.60\u7248Linux\u5185\u6838\u53ca\u4ee5\u540e\uff0cGDB\u5bf9\u4f7f\u7528fork/vfork\u521b\u5efa\u5b50\u8fdb\u7a0b\u7684\u7a0b\u5e8f\u63d0\u4f9b\u4e86follow-fork-mode\u9009\u9879\u6765\u652f\u6301\u591a\u8fdb\u7a0b\u8c03\u8bd5\u3002
follow-fork-mode\u7684\u7528\u6cd5\u4e3a\uff1a
set follow-fork-mode [parent|child]
parent: fork\u4e4b\u540e\u7ee7\u7eed\u8c03\u8bd5\u7236\u8fdb\u7a0b\uff0c\u5b50\u8fdb\u7a0b\u4e0d\u53d7\u5f71\u54cd\u3002
child: fork\u4e4b\u540e\u8c03\u8bd5\u5b50\u8fdb\u7a0b\uff0c\u7236\u8fdb\u7a0b\u4e0d\u53d7\u5f71\u54cd\u3002
\u56e0\u6b64\u5982\u679c\u9700\u8981\u8c03\u8bd5\u5b50\u8fdb\u7a0b\uff0c\u5728\u542f\u52a8gdb\u540e\uff1a
(gdb) set follow-fork-mode child
\u5e76\u5728\u5b50\u8fdb\u7a0b\u4ee3\u7801\u8bbe\u7f6e\u65ad\u70b9\u3002
\u6b64\u5916\u8fd8\u6709detach-on-fork\u53c2\u6570\uff0c\u6307\u793aGDB\u5728fork\u4e4b\u540e\u662f\u5426\u65ad\u5f00\uff08detach\uff09\u67d0\u4e2a\u8fdb\u7a0b\u7684\u8c03\u8bd5\uff0c\u6216\u8005\u90fd\u4ea4\u7531GDB\u63a7\u5236\uff1a
set detach-on-fork [on|off]
on: \u65ad\u5f00\u8c03\u8bd5follow-fork-mode\u6307\u5b9a\u7684\u8fdb\u7a0b\u3002
off: gdb\u5c06\u63a7\u5236\u7236\u8fdb\u7a0b\u548c\u5b50\u8fdb\u7a0b\u3002follow-fork-mode\u6307\u5b9a\u7684\u8fdb\u7a0b\u5c06\u88ab\u8c03\u8bd5\uff0c\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u7f6e\u4e8e\u6682\u505c\uff08suspended\uff09\u72b6\u6001\u3002
\u6ce8\u610f\uff0c\u6700\u597d\u4f7f\u7528GDB 6.6\u6216\u4ee5\u4e0a\u7248\u672c\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662fGDB6.4\uff0c\u5c31\u53ea\u6709follow-fork-mode\u6a21\u5f0f\u3002
follow-fork-mode/detach-on-fork\u7684\u4f7f\u7528\u8fd8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u7531\u4e8e\u5176\u7cfb\u7edf\u5185\u6838/gdb\u7248\u672c\u9650\u5236\uff0c\u6211\u4eec\u53ea\u80fd\u5728\u7b26\u5408\u8981\u6c42\u7684\u7cfb\u7edf\u4e0a\u624d\u80fd\u4f7f\u7528\u3002\u800c\u4e14\uff0c\u7531\u4e8efollow-fork-mode\u7684\u8c03\u8bd5\u5fc5\u7136\u662f\u4ece\u7236\u8fdb\u7a0b\u5f00\u59cb\u7684\uff0c\u5bf9\u4e8efork\u591a\u6b21\uff0c\u4ee5\u81f3\u4e8e\u51fa\u73b0\u5b59\u8fdb\u7a0b\u6216\u66fe\u5b59\u8fdb\u7a0b\u7684\u7cfb\u7edf\uff0c\u4f8b\u5982\u4e0a\u56fe3\u8fdb\u7a0b\u7cfb\u7edf\uff0c\u8c03\u8bd5\u8d77\u6765\u5e76\u4e0d\u65b9\u4fbf\u3002

\u3000\u3000follow-fork-mode
\u3000\u3000\u57282.5.60\u7248Linux\u5185\u6838\u53ca\u4ee5\u540e\uff0cGDB\u5bf9\u4f7f\u7528fork/vfork\u521b\u5efa\u5b50\u8fdb\u7a0b\u7684\u7a0b\u5e8f\u63d0\u4f9b\u4e86follow-fork-mode\u9009\u9879\u6765\u652f\u6301\u591a\u8fdb\u7a0b\u8c03\u8bd5\u3002
\u3000\u3000follow-fork-mode\u7684\u7528\u6cd5\u4e3a\uff1a
\u3000\u3000set follow-fork-mode [parent|child]
\u3000\u3000parent: fork\u4e4b\u540e\u7ee7\u7eed\u8c03\u8bd5\u7236\u8fdb\u7a0b\uff0c\u5b50\u8fdb\u7a0b\u4e0d\u53d7\u5f71\u54cd\u3002
\u3000\u3000child: fork\u4e4b\u540e\u8c03\u8bd5\u5b50\u8fdb\u7a0b\uff0c\u7236\u8fdb\u7a0b\u4e0d\u53d7\u5f71\u54cd\u3002
\u3000\u3000\u56e0\u6b64\u5982\u679c\u9700\u8981\u8c03\u8bd5\u5b50\u8fdb\u7a0b\uff0c\u5728\u542f\u52a8gdb\u540e\uff1a
\u3000\u3000(gdb) set follow-fork-mode child

\u3000\u3000\u5e76\u5728\u5b50\u8fdb\u7a0b\u4ee3\u7801\u8bbe\u7f6e\u65ad\u70b9\u3002
\u3000\u3000\u6b64\u5916\u8fd8\u6709detach-on-fork\u53c2\u6570\uff0c\u6307\u793aGDB\u5728fork\u4e4b\u540e\u662f\u5426\u65ad\u5f00\uff08detach\uff09\u67d0\u4e2a\u8fdb\u7a0b\u7684\u8c03\u8bd5\uff0c\u6216\u8005\u90fd\u4ea4\u7531GDB\u63a7\u5236\uff1a
\u3000\u3000set detach-on-fork [on|off]
\u3000\u3000on: \u65ad\u5f00\u8c03\u8bd5follow-fork-mode\u6307\u5b9a\u7684\u8fdb\u7a0b\u3002
\u3000\u3000off: gdb\u5c06\u63a7\u5236\u7236\u8fdb\u7a0b\u548c\u5b50\u8fdb\u7a0b\u3002follow-fork-mode\u6307\u5b9a\u7684\u8fdb\u7a0b\u5c06\u88ab\u8c03\u8bd5\uff0c\u53e6\u4e00\u4e2a\u8fdb\u7a0b\u7f6e\u4e8e\u6682\u505c\uff08suspended\uff09\u72b6\u6001\u3002
\u3000\u3000\u6ce8\u610f\uff0c\u6700\u597d\u4f7f\u7528GDB 6.6\u6216\u4ee5\u4e0a\u7248\u672c\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u7684\u662fGDB6.4\uff0c\u5c31\u53ea\u6709follow-fork-mode\u6a21\u5f0f\u3002
\u3000\u3000follow-fork-mode/detach-on-fork\u7684\u4f7f\u7528\u8fd8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u7531\u4e8e\u5176\u7cfb\u7edf\u5185\u6838/gdb\u7248\u672c\u9650\u5236\uff0c\u6211\u4eec\u53ea\u80fd\u5728\u7b26\u5408\u8981\u6c42\u7684\u7cfb\u7edf\u4e0a\u624d\u80fd\u4f7f\u7528\u3002\u800c\u4e14\uff0c\u7531\u4e8efollow-fork-mode\u7684\u8c03\u8bd5\u5fc5\u7136\u662f\u4ece\u7236\u8fdb\u7a0b\u5f00\u59cb\u7684\uff0c\u5bf9\u4e8efork\u591a\u6b21\uff0c\u4ee5\u81f3\u4e8e\u51fa\u73b0\u5b59\u8fdb\u7a0b\u6216\u66fe\u5b59\u8fdb\u7a0b\u7684\u7cfb\u7edf\uff0c\u4f8b\u5982\u4e0a\u56fe3\u8fdb\u7a0b\u7cfb\u7edf\uff0c\u8c03\u8bd5\u8d77\u6765\u5e76\u4e0d\u65b9\u4fbf\u3002

在大多数系统,gdb对使用fork创建的进程没有进行特别的支持。当父进程使用fork创建子进程,gdb仍然只会调试父进程,而子进程没有得到控制和调试。这个时候,如果你在子进程执行到的代码中设置了断点,那么当子进程执行到这个断点的时候,会产生一个SIGTRAP的信号,如果没有对此信号进行捕捉处理,就会按默认的处理方式处理——终止进程。
当然,你可以使用时间延迟的方法,在子进程fork出来之后,使用Sleep函数等待一段时间再运行,在这段时间中你使用ps找到该进程,然后使用Attach方法把该进程附加到gdb中,从而达到可以调试子进程的目的。
在一部分系统中(我使用的是基于2.6内核的CentOS,支持follow-fork和detach-on-fork模式),比如HP-UX11.x之后的版本,Linux2.5.60之后的版本,可以使用以下的方法来达到方便的进行多进程调试功能。
默认情况下,父进程fork一个子进程,gdb只会继续调试父进程而不会管子进程的运行。
如果你想跟踪子进程进行调试,可以使用set follow-fork-mode mode来设置fork跟随模式。
set follow-fork-mode 所带的mode参数可以是以下的一种:
parent
gdb只跟踪父进程,不跟踪子进程,这是默认的模式。
child
gdb在子进程产生以后只跟踪子进程,放弃对父进程的跟踪。
进入gdb以后,我们可以使用show follow-fork-mode来查看目前的跟踪模式。

可以看到目前使用的模式是parent。

然而,有的时候,我们想同时调试父进程和子进程,以上的方法就不能满足了。Linux提供了set detach-on-fork mode命令来供我们使用。其使用的mode可以是以下的一种:
on
只调试父进程或子进程的其中一个(根据follow-fork-mode来决定),这是默认的模式。
off
父子进程都在gdb的控制之下,其中一个进程正常调试(根据follow-fork-mode来决定)
另一个进程会被设置为暂停状态。
同样,show detach-on-fork显示了目前是的detach-on-fork模式,如上图。

以上是调试fork产生子进程的情况,但是如果子进程使用exec系统函数而装载了新程序执行呢?——我们使用set follow-exec-mode mode提供的模式来跟踪这个exec装载的程序。mode可以是以下的一种:
new 当发生exec的时候,如果这个选项是new,则新建一个inferior给执行起来的子进程,而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。
same 当发生exec的时候,如果这个选项是same(默认值),因为父进程已经退出,所以自动在执行exec的inferior上控制子进程。

我们可以使用apue里面第8章的例子代码来做测试:

#include "apue.h"

intglob = 6;/* external variable in initialized data */
charbuf[] = "a write to stdout\n";

int
main(void)
{
intvar;/* automatic variable on the stack */
pid_tpid;

var = 88;
if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1)
err_sys("write error");
printf("before fork\n");/* we don't flush stdout */

if ((pid = fork()) < 0) {
err_sys("fork error");
} else if (pid == 0) {/* child */
glob++;/* modify variables */
var++;
} else {
sleep(2);/* parent */
}

printf("pid = %d, glob = %d, var = %d\n", getpid(), glob, var);
exit(0);
}

  • Linux寮鍙戦渶瑕佷粈涔堝憿??闇瑕佸叿澶囦粈涔堝熀纭鍛??
    绛旓細7銆浣跨敤杩囧摢浜涜繘绋嬮棿閫氳鏈哄埗锛屽苟璇︾粏璇存槑 8銆乵akefile缂栧啓锛岃櫧鐒舵瘮杈冨熀纭锛屼絾鏄細琚棶鍒 9銆gdb璋冭瘯鐩稿叧鐨勭粡楠岋紝浼氳闂埌 10銆濡備綍瀹氫綅鍐呭瓨娉勯湶?11銆佸姩鎬侀摼鎺ュ拰闈欐侀摼鎺ョ殑鍖哄埆 12銆32浣嶇郴缁熶竴涓繘绋嬫渶澶氬灏戝爢鍐呭瓨 13銆佸绾跨▼鍜澶氳繘绋鐨勫尯鍒(閲嶇偣 蹇呴』浠巆pu璋冨害锛屼笂涓嬫枃鍒囨崲锛屾暟鎹叡浜紝澶氭牳cup鍒╃敤...
  • 宓屽叆寮忛浂鍩虹鍙互瀛﹀悧?
    绛旓細璇剧▼鍐呭涓昏鍖呮嫭锛氣憼C锛孞ava鏍稿績缂栫▼锛歝璇█鏍稿績缂栫▼锛孞ava鏍稿績缂栫▼锛涒憽Linux鏍稿績鎿嶄綔涓庣畻娉曪細Linux绯荤粺浣跨敤锛孡inux-c缂栫▼鏍稿績鎶鏈紝绮惧搧鏁版嵁缁撴瀯锛孡inux-c缂栫▼绮鹃珦锛涒憿鏍稿績鎿嶄綔涓庣畻娉曪細Linux绯荤粺缂栫▼锛孡inux缃戠粶缂栫▼鏍稿績鎶鏈紝UI缂栫▼锛孞ava鏍稿績缂栫▼锛屽畨鍗撴牳蹇冩妧鏈紱鈶RM+Linux搴曞眰寮鍙戯細鏁板瓧鐢佃矾锛孉RM缂栫▼鏍稿績...
  • 瀛︿範Linux鐨勬楠ゆ槸鎬庢牱鐨
    绛旓細缃戠粶缂栫▼锛屽氨鏄痵ocket缂栫▼,Linux缂栫▼锛岃繖涓涓嶅ソ绛変簬鍟ラ兘娌″锛岃繖涓及璁¤繕寰椾簡瑙d竴涓婽CP/IP鍗忚锛岀紪绋嬫柟闈富瑕佹槸閭e嚑姝ワ紝鐢宠socket锛宐ind锛宭isten锛宎ccept鍑犳锛岃鐔熸倝绉嶅父瑙佺殑鏈嶅姟鍣ㄦā鍨嬶紝杩涚▼姹犵嚎绋嬫睜鏂瑰紡鐨勶紝澶氳繘绋鏂瑰紡鐨勶紝澶嶇敤鏂瑰紡鐨勶紝鏈閲嶈鐨勬槸澶嶇敤鏂瑰紡鐨勶紝杩欓儴鍒嗗彲浠ュ厛鍙啓鏈嶅姟鍣紝娴嬭瘯鐩存帴鐢...
  • 鎴戠湡蹇冭瀛﹀ソLINUX,璇烽棶濡備綍瀛﹀ソ?
    绛旓細鑷繁澶氬姩鎵,涓嶈闈炶绛夌潃鍒汉甯綘瑙e喅闂銆 鍏 濡備綍寰楀埌鑱旀満甯姪 鍜岀鏈夋搷浣滅郴缁熶笉鍚,鍚勪釜Linux鐨勫彂琛岀増鏈殑鎶鏈敮鎸佹椂闂撮兘杈冪煭,杩欏浜嶭inux鍒濆鑰呮槸寰寰涓嶅鐨勩傚叾瀹炲綋浣犲畨瑁呬簡涓涓畬鏁寸殑Linux绯荤粺鍚庡叾涓凡缁忓寘鍚簡涓涓己澶х殑甯姪,鍙槸鍙兘浣犺繕娌℃湁鍙戠幇鍜浣跨敤瀹冧滑鐨勬妧宸с 1. 涓绘祦Linux鍙戣鐗堥兘鑷甫闈炲父璇︾粏鐨...
  • 濡備綍浣跨敤gdb璋冭瘯澶氳繘绋
    绛旓細鍦2.5.60鐗圠inux鍐呮牳鍙婁互鍚庯紝GDB瀵浣跨敤fork/vfork鍒涘缓瀛愯繘绋嬬殑绋嬪簭鎻愪緵浜唂ollow-fork-mode閫夐」鏉ユ敮鎸澶氳繘绋嬭皟璇銆俧ollow-fork-mode鐨勭敤娉曚负锛歴et follow-fork-mode [parent|child]parent: fork涔嬪悗缁х画璋冭瘯鐖惰繘绋嬶紝瀛愯繘绋嬩笉鍙楀奖鍝嶃俢hild: fork涔嬪悗璋冭瘯瀛愯繘绋嬶紝鐖惰繘绋嬩笉鍙楀奖鍝嶃傚洜姝ゅ鏋滈渶瑕佽皟璇曞瓙杩涚▼锛...
  • 濡備綍浣跨敤gdb璋冭瘯澶氳繘绋
    绛旓細follow-fork-mode 鍦2.5.60鐗圠inux鍐呮牳鍙婁互鍚庯紝GDB瀵浣跨敤fork/vfork鍒涘缓瀛愯繘绋嬬殑绋嬪簭鎻愪緵浜唂ollow-fork-mode閫夐」鏉ユ敮鎸澶氳繘绋嬭皟璇銆俧ollow-fork-mode鐨勭敤娉曚负锛歴et follow-fork-mode [parent|child]parent: fork涔嬪悗缁х画璋冭瘯鐖惰繘绋嬶紝瀛愯繘绋嬩笉鍙楀奖鍝嶃俢hild: fork涔嬪悗璋冭瘯瀛愯繘绋嬶紝鐖惰繘绋嬩笉鍙楀奖鍝嶃傚洜姝...
  • 濡備綍浣跨敤gdbserver璋冭瘯涓涓猟aemon杩涚▼
    绛旓細鍦2.5.60鐗圠inux鍐呮牳鍙婁互鍚庯紝GDB瀵浣跨敤fork/vfork鍒涘缓瀛愯繘绋嬬殑绋嬪簭鎻愪緵浜唂ollow-fork-mode閫夐」鏉ユ敮鎸澶氳繘绋嬭皟璇銆俧ollow-fork-mode鐨勭敤娉曚负锛歴et follow-fork-mode [parentchild]parent: fork涔嬪悗缁х画璋冭瘯鐖惰繘绋嬶紝瀛愯繘绋嬩笉鍙楀奖鍝嶃俢hild: fork涔嬪悗璋冭瘯瀛愯繘绋嬶紝鐖惰繘绋嬩笉鍙楀奖鍝嶃傚洜姝ゅ鏋滈渶瑕佽皟璇曞瓙杩涚▼锛屽湪...
  • 濡備綍鐢╣db璋冭瘯fork鍑烘潵鐨勫瓙杩涚▼
    绛旓細follow-fork-mode 鍦2.5.60鐗圠inux鍐呮牳鍙婁互鍚庯紝GDB瀵浣跨敤fork/vfork鍒涘缓瀛愯繘绋嬬殑绋嬪簭鎻愪緵浜唂ollow-fork-mode閫夐」鏉ユ敮鎸澶氳繘绋嬭皟璇銆俧ollow-fork-mode鐨勭敤娉曚负锛歴et follow-fork-mode [parent|child]parent: fork涔嬪悗缁х画璋冭瘯鐖惰繘绋嬶紝瀛愯繘绋嬩笉鍙楀奖鍝嶃俢hild: fork涔嬪悗璋冭瘯瀛愯繘绋嬶紝鐖惰繘绋嬩笉鍙楀奖鍝嶃傚洜姝...
  • 扩展阅读:boot设置硬盘为第一启动项 ... oppo关闭usb调试模式 ... oppo手机usb调试在哪 ... 一加手机不弹出usb调试 ... 安卓手机开启usb调试 ... iqoo手机怎么关掉adb调试 ... oppo关闭adb调试模式 ... 华为usb调试开启不了 ... 荣耀手机无法usb调试 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网