良许Linux教程网 干货合集 Linuxgdb调试多进程

Linuxgdb调试多进程

Linux如何使用gdb调试多进程?gdb是Linux下的调试工具,如果需要调试,则要在编译时加上-g选项,否则无法调试,下面为大家分享一下Linuxgdb调试多进程具体方法。

一.gdb常用目录表

操作 描述
l 命令相当于list,从第一行开始列出源码
回车 重复上一次命令
break +行号 设置断点
break+函数名 在函数的入口点设置断点
r 运行程序running的简写
into break 查看断点信息
n 单语句执行 ,next的简写
c 继续运行程序,continue的简写
bt 查看函数的堆栈
finish 退出函数
q 退出gdb

显示详细信息

二.多进程调试

测试代码:

 #include
 #include
 #include
 
 
 int main()
 {
     pid_t id = fork();
     if(id == 0)//child
     {
         printf("I am child ,my id is:%d;my father id is:%d \n",getpid(),getppid());
     }
     else if(id > 0)//parent
     {
         sleep(2);
         printf("I am father:%d \n",getpid());
     }
     else
     {
         perror("fork error");
         return -1;
     }
     return 0;
 }
 12345678910111213141516171819202122232425

默认设置下,在调试多进程程序时GDB只会调试主进程。但是GDB(>V7.0)支持多进程的分别以及同时调试,换句话说,GDB可以同时调试多个程序。只需要设置follow-fork-mode(默认值:parent)和detach-on-fork(默认值:on)即可。

parent on 只调试主进程(此程序中系统默认只调试parent)
child on 只调试子进程
parent off 同时调试两个进程,gdb跟主进程。子进程block(阻塞)在fork位置
child off 同时调试两个进程,gdb跟子进程,主进程block在fork位置

设置方法如下图:show follow-fork-mode show detach-on-fork 这里写图片描述

  • 查询正在调试的进程:info inferiors 显示GDB调试的所有inferior,GDB会为他们分配ID。其中带有*的进程是正在调试的inferior. ( GDB将每一个被调试程序的执行状态记录在一个名为inferior的结构中。一般情况下一个inferior对应一个进程,每个不同的inferior有不同的地址空间。inferior有时候会在进程没有启动的时候就存在。) 切换调试的进程: inferior 切换到ID是num的inferior进行调试。

这里写图片描述

  • 添加新的调试进程: add-inferior [-copies n] [-exec executable] ,可以用file executable来分配给inferior可执行文件。 增加n个inferior并执行程序为executable。如果不指定n只增加一个inferior。如果不指定executable,则执行程序留空,增加后可使用file命令重新指定执行程序。这时候创建的inferior其关联的进程并没启动。

  • remove-inferiors infno: 删除一个infno号的inferior。如果inferior正在运行,则不能删除,所以删除前需要先kill或者detach这个inferior。

  • detach inferior: detach掉编号是infno的inferior。注意这个inferior还存在,可以再次用run命令执行它

  • kill inferior infno: kill掉infno号inferior。注意这个inferior仍然存在,可以再次用run等命令执行它。

三.多线程调试

多线程代码

 #include
 #include
 
 void* start_routine1()
 {
     printf("I am a thread1 ,my tid is:%u\n",pthread_self());
     return NULL;
 }
 void* start_routine2()
 {
     printf("I am a thread1 ,my tid is:%u\n",pthread_self());
     return NULL;
 }
 int main()
 {
     pthread_t tid1;
     pthread_t tid2;
     pthread_create(&tid1,NULL, start_routine1, NULL);
     pthread_create(&tid2,NULL, start_routine2, NULL);
 
     pthread_join(tid1,NULL);
     pthread_join(tid2,NULL);
     return 0;
 }123456789101112131415161718192021222324

注意:在创建线程时候,在编译链接的时候一定要加-lpthread!!!一定要加-lpthread!!!一定要加-lpthread!!!! 重要的事情说三遍,惨痛的教训 运行图 这里写图片描述

在多线程编程时,当我们需要调试时,有时需要控制某些线程停在断点,有些线程继续执行。有时需要控制线程的运行顺序。有时需要中断某个线程,切换到其他线程。这些都可以通过gdb实现。 GDB默认支持调试多线程,跟主线程,子线程block在create thread。 多线程编程常用目录表

操作 描述
info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。
thread ID 切换当前调试的线程为指定ID的线程
break FileName.cpp:LinuNum thread all 所有线程都在文件FileName.cpp的第LineNum行有断点
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command
thread apply all command 让所有被调试线程执行GDB命令command
set scheduler-locking off/on/step 在调式某一个线程时,其他线程是否执行。off,不锁定任何线程,默认值。on,锁定其他线程,只有当前线程执行。step,在step(单步)时,只有被调试线程运行。
set non-stop on/off 当调式一个线程时,其他线程是否运行
set pagination on/off 在使用backtrace时,在分页时是否停止
set target-async on/ff 同步和异步。同步,gdb在输出提示符之前等待程序报告一些线程已经终止的信息。而异步的则是直接返回

显示详细信息

四.关于core

core的意思是核心,dumped的意思就是抛出,转储,core dumped就是核心转储的意思。当一个进程异常退出前,该进程会抛出当时该程序进程的内存详细情况存储在硬盘上,文件名通常是core,这就叫core dump。

进程异常终止通常是因为代码存在BUG,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做事后调试.

关于core的指令:

指令 描述
uname -a 查看机器参数
ulimit -a 查看默认参数
ulimit -c 1024 设置core文件大小为1024
ulimit -c unlimit 设置core文件大小为无限

修改ulimit的设置,让它产生。

指令 描述
ulimit -c 1024 设置core文件大小为1024。要是core文件大于1024个块,就产生不出来了。
ulimit -c unlimit 设置core文件大小为无限

以上就是良许教程网为各位朋友分享的Linux系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你!

137e00002230ad9f26e78-265x300

本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部