Linux:如何使用gdb调试多进程多线程程序

Linux:如何使用gdb调试多进程多线程程序,第1张

follow-fork-mode

在2560版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 66或以上版本,如果你使用的是GDB64,就只有follow-fork-mode模式。

follow-fork-mode/detach-on-fork的使用还是比较简单的,但由于其系统内核/gdb版本限制,我们只能在符合要求的系统上才能使用。而且,由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,以至于出现孙进程或曾孙进程的系统,例如上图3进程系统,调试起来并不方便。

int main(int argc, char argv)

{

char p;

int i;

p= (char) malloc(30); //加类型转换 (char)

strcpy(p,"not 30 bytes");

printf("p=<%s>\n",p);

if(argc==2){

if(strcmp(argv[1],"-b") ==0) p[0]='a'; //不要漏小括号,下标最大29,这里用0

else if(strcmp(argv[1],"-f")==0){

p[0]='b';

}

}

printf("%s\n",p); //这里输出

free(p); //释放

return 0;

}

输入 程序名 -b, 输出:aot 30 bytes

输入 程序名 -f, 输出:bot 30 bytes

首先需要在 WINDOWS 系统下面安装一个 C 语言编译器(例如:Visual C++),然后把 Linux 下的 C 源程序拷贝到 WINDOWS 系统下面,进入 Visual C++ 环境,即可调试 Linux 系统上的 C 源程序。但是在这里注意一点就是:如果你使用的 C 语言的库函数不是标准的 C 库函数,那么在 WINDOWS 下就无法调试通过,也就是说,你必须保证你的 C 源程序是通用的 C 语言代码才行。

以上就是关于Linux:如何使用gdb调试多进程多线程程序全部的内容,包括:Linux:如何使用gdb调试多进程多线程程序、linux c语言调试错误、如何在windows上调试Linux上的C程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9427001.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存