文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linux如何使用gdb调试多进程

2023-06-28 08:46

关注

这篇文章主要介绍了Linux如何使用gdb调试多进程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux如何使用gdb调试多进程文章都会有所收获,下面我们一起来看看吧。

一.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)即可。

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

设置方法如下图:show follow-fork-mode show detach-on-fork Linux如何使用gdb调试多进程

Linux如何使用gdb调试多进程

三.多线程调试

多线程代码

 #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!!!! 重要的事情说三遍,惨痛的教训 运行图 Linux如何使用gdb调试多进程

在多线程编程时,当我们需要调试时,有时需要控制某些线程停在断点,有些线程继续执行。有时需要控制线程的运行顺序。有时需要中断某个线程,切换到其他线程。这些都可以通过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如何使用gdb调试多进程”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Linux如何使用gdb调试多进程”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-人工智能
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯