linux中多进程调试,linux下用gdb调试多进程

今天来学习一下linux下gdb如何调试多进程,在学习之前我我们能先看一张表:

43192_0.png

这张表是gdb调试的命令表,这对那些对gdb不熟的同学来说是非常有必要的。

一、多进程调试的命令

1、set follow-fork-mode parent|child

因为gdb在一般情况下,只会调试主进程。这条命令就可以使gdb来实现多进程的调试,进入gdb后默认调试的是parent,要想调试child的话,需要设置set follow-fork-mode child,然后进入调试。当然这种方式只能同时调试一个进程。

show follow-fork-mode就是查看当前调试的fork的模式。

2、detach-on-fork on|off:

设置为on,只调试父进程或子进程其中一个,需要根据follow-fork-mode决定,这是默认模式。

设置成off,父子进程都在gdb的控制之下,其中一个进程正常调试,需要根据follow-fork-mode决定,另一个进程会被设置为暂停状态。

GDB将每一个被调试程序的执行状态记录在一个名为inferior的结构中。一般情况下一个inferior对应一个进程,每个不同的inferior有不同的地址空间。inferior有时候会在进程没有启动的时候就存在。

3、info inferiors:

这条语句是为了显示GDB调试的所有inferior,GDB会为他们分配ID。其中带有*的进程是正在调试的inferior。

4、inferior num:

切换需要调试的进程的id

5、add-inferior [-copies n] [-exec executable]:

增加n个inferior并执行程序为executable。如果不指定n只增加一个inferior。如果不指定executable,则执行程序留空,增加后可使用file命令重新指定执行程序。这时候创建的inferior其关联的进程并没启动。

6、clone-inferior [-copies n] [infno]:

复制n个编号是infno的inferior。如果不指定n的话,就只复制一个inferior。如果不指定infno,则就复制正在调试的inferior。

7、detach inferior infno:

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

8、kill inferior infno:

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

9、remove-inferior infno:

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

10、set schedule-multiple on|off:

设为off:只有当前inferior会执行。

设为on:全部是执行状态的inferior都会执行。

这个选项类似于多线程调试里的set scheduler-locking选项

如果scheduler-locking是指为on,即使schedule-multiple设置为on,也只有当前进程的当前线程会执行。

11、set follow-exec-mode new|same:

设置same:当发生exec的时候,在执行exec的inferior上控制子进程。

设置为new:新建一个inferior给执行起来的子进程。而父进程的inferior仍然保留,当前保留的inferior的程序状态是没有执行。

show follow-exec-mode:查看follow-exec-mode设置的模式。

12、set print inferior-events on|off:用来打开和关闭inferior状态的提示信息。

show print inferior-events :查看print inferior-events设置的状态。

13、maint info program-spaces:

用来显示当前GDB一共管理了多少地址空间。

二、多进程的代码

#include

#include

#include

#include

#include

int main()

{

pid_t id = fork();

if(id < 0)

{

perror("fork error!");

return -1;

}

else if(id == 0)

{

printf("child is: %d,father is: %dn",getpid(),getppid());

}

else

{

sleep(1);

printf("father is :%dn",getpid());

wait(NULL);

}

return 0;

}

三、调试情况

在编译的时候别忘了加上 -g(我刚开始就是犯了这样的错……)

1、设置调试的模式:

43192_1.png

2、这是查看两个进程的情况:

43192_2.png

如果大家需要切换要调试的进程可以使用上面我们提到过得命令:inferior 进程id这样就可以切换者调试其他的进程了。

注意:我们看见的进程前的*号,就表示当前正在调试的进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338196.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初学者宝典:C语言入门基础知识大全(下)

06类型的自动转换和强制转换当同一表达式中各数据的类型不同时&#xff0c;编译程序会自动把它们转变成同一类型后再进行计算。转换优先级为&#xff1a;char < int < float < double 即左边级别“低“的类型向右边转换。具体地说&#xff0c;若在表达式中优先级最高的…

linux接口 头文件,第一种:1、添加关键头文件:#include linux/of_gpio.h#include linux/gpio.h...

第一种&#xff1a;1、添加关键头文件&#xff1a;#include #include #include #include #include #include 2、在已经存在驱动文件中搜索"DEVICE_ATTR"关键字&#xff0c;如果存在&#xff0c;直接参考已经存在的方法添加一个即可&#xff0c;如下&#xff1a;unsig…

viewpager默认界面_使用默认方法的界面演变–第一部分:方法

viewpager默认界面几周前&#xff0c;我们详细研究了默认方法 -Java 8中引入的一项功能&#xff0c;该功能允许为接口方法提供实现&#xff0c;即方法主体&#xff0c;从而定义接口中的行为。 引入此功能是为了实现接口演进 。 在JDK的上下文中&#xff0c;这意味着在不破坏所…

C语言中scanf函数的3种常见问题与应对技巧

在写代码时难免对一些知识点不熟悉&#xff0c;导致犯错&#xff0c;今天分享几点小知识给大家。空白符问题#includeint main(void){int a;printf("input the data ");scanf("%d ",&a); //这里多了一个回车符printf("%d",a);return 0;}结果…

jpa和hibernate_JPA和Hibernate级联类型的初学者指南

jpa和hibernate介绍 JPA将实体状态转换转换为数据库DML语句。 由于对实体图进行操作很常见&#xff0c;因此JPA允许我们将实体状态更改从父级传播到子级 。 通过CascadeType映射配置此行为。 JPA与Hibernate级联类型 Hibernate支持所有JPA级联类型和一些其他旧式级联样式。 下…

linux find 权限不够,超级用户find: `/home/pipi/.gvfs': 权限不够

用sudo su命令切换成的根用户&#xff0c;在找某文件的时候报错&#xff1a;rootubuntu:/home/pipi# find / -perm -2000/sbin/unix_chkpwdfind: /home/pipi/.gvfs: 权限不够就是普通用户pipi的主目录下的一个叫 .gvfs 的目录&#xff0c;dr-x------ 2 pipi pipi 0 …

aws上部署hadoop_在AWS Elastic MapReduce上运行PageRank Hadoop作业

aws上部署hadoop在上一篇文章中&#xff0c;我描述了一个执行PageRank计算的示例&#xff0c;该示例是使用Apache Hadoop进行Mining Massive Dataset课程的一部分。 在那篇文章中&#xff0c;我接受了Java中现有的Hadoop作业&#xff0c;并做了一些修改&#xff08;添加了单元测…

linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...

当前位置:我的异常网 Linux/Unix 小弟我在linux下写了个简单的多线程端口扫描程序&#xff0c;小弟我在linux下写了个简单的多线程端口扫描程序&#xff0c;运行时出现有关问题,请问一下(2)www.myexceptions.net 网友分享于&#xff1a;2013-02-26 浏览&#xff1a;23次usle…

在嵌套使用if语句时,C语言规定else总是什么?

C语言的语法规定&#xff1a;else子句总是与前面最近的不带else的if相结合&#xff0c;与书写格式无关。在C语言中&#xff0c;使用if和else关键字对条件进行判断。请先看下面的代码&#xff1a;#include int main(){ int age; printf("请输入你的年龄&#xff1a;&…

optional空值判断_Java 8 Optional不仅用于替换空值

optional空值判断总览 在Java 8中&#xff0c;您可以返回Optional而不是返回null。 就像您在Java 7中所做的那样。这可能会有所不同&#xff0c;这取决于您是否倾向于忘记检查null还是使用静态代码分析来检查nullalbe引用。 但是&#xff0c;还有一种更引人注目的情况是将Opti…

continue语句的作用是结束整个循环的执行吗?

continue 语句的作用是结束本次循环&#xff0c;跳过循环体中剩余的语句而强制进入下一次循环&#xff08;回到循环体的开头准备再次执行循环体&#xff09;。continue语句只用在 while、for 循环中&#xff0c;常与 if 条件语句一起使用&#xff0c;判断条件是否成立。使用方式…

linux 远程权限不够,Eclipse连接远程Hadoop集群开发时权限不足问题解决方案

eclipse连接远程Hadoop集群开发时报错Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied: userd, accessWRITE, inode"data":zxg:supergroup:rwxr-xr-xat org.apache.hadoop.hdfs.server.namenode.FSPerm…

jsp导入jstl标签库_EE JSP:使用JSTL标记库生成动态内容

jsp导入jstl标签库除了在JSP中编写自己的定制标记之外&#xff0c;您还将发现Java EE实际上提供了一组Java标准标记库&#xff08;JSTL&#xff09;供您使用。 这些内置标签包括重复&#xff08;for-loop&#xff09;标签&#xff0c;条件标签&#xff0c;变量声明和输出标签等…

一文掌握 C 智能指针的使用

RAII 与引用计数了解 objective-C/Swift 的程序员应该知道引用计数的概念。引用计数这种计数是为了防止内存泄露而产生的。基本想法是对于动态分配的对象&#xff0c;进行引用计数&#xff0c;每当增加一次对同一个对象的引用&#xff0c;那么引用对象的引用计数就会增加一次&a…

linux里面启用无线网卡,linux启用无线网卡上网

1、使用cat /proc/version查看linux内核版本号&#xff0c;我的系统是Linux version 2.6.32-220.el6.i6862、使用cat /etc/issue查看linux发行版本号&#xff0c;我的系统是Red Hat Enterprise Linux Server release 6.2 (Santiago)现在 进入正题&#xff0c;如何在redhat linu…

fwrite函数的一般调用形式是什么?

fwrite() 是C 语言标准库中的一个文件处理函数&#xff0c;功能是向指定的文件中写入若干数据块&#xff0c;如成功执行则返回实际写入的数据块数目。该函数以二进制形式对文件进行操作&#xff0c;不局限于文本文件。语法&#xff1a;fwrite(buffer,size,count,fp)参数&#x…

java 不同类型 映射_如何使用Java泛型映射不同的值类型

java 不同类型 映射有时&#xff0c;一般的开发人员会遇到这样的情况&#xff0c;即他必须在特定容器内映射任意类型的值。 但是&#xff0c;Java集合API仅提供与容器相关的参数化。 例如&#xff0c;这将HashMap的类型安全使用限制为单个值类型。 但是&#xff0c;如果您想混合…

linux vim自动换行,VIM 的自动换行及自动折行设置

VIM 的自动换行及自动折行设置以 .vimrc 文件中的设置为例&#xff1a;" 自动换行是每行超过 n 个字的时候 vim 自动加上换行符" 需要注意的是&#xff0c;如果一个段落的首个单词很长&#xff0c;超出了自动换行设置的字符&#xff0c;" 这种情况下不会换行。&…

lambdas 排序_Java8 Lambdas:解释性能缺陷的排序

lambdas 排序与Peter Lawrey合作撰写 。 几天前&#xff0c;我对使用新的Java8声明式的排序性能提出了一个严重的问题。 在这里查看博客文章。 在那篇文章中&#xff0c;我仅指出了问题&#xff0c;但在这篇文章中&#xff0c;我将更深入地了解和解释问题的原因。 这将通过使用…

strncmp函数用法是什么

strncmp函数用法&#xff1a;函数原型int strcmp(char *str1,char * str2&#xff0c;int n)功能比较字符串str1和str2的前n个字符。头文件#include 返回值返回值&#xff1a;返回整数值&#xff1a;当str1<str2时&#xff0c;返回值<0&#xff1b; str1"str2时&…