gdb调试多线程多进程
多进程调试
我们使用gdb调试程序,gdb的调试默认是调试父进程的,如果要做到对父进程和子进程都做到调试,所以附加了调试子进程的功能。
- 设置条件
如果让gdb可以同时调试多个程序,只需要设置follow-fork-mode(默认:parent)和detach-on-fork(默认:on)就好了。
follow-fork-mode detach-on-fork 操作
parent on 只调试主进程
child on 只调试子进程
parent off 同时调试两个进程,gdb跟进父进程,子进程block在fork处
child off 同时调试两个进程,gdb跟进子进程,父进程block在fork处
注:设置方法:
set follow-fork-mode [parent|child]
set detach-on-fork [on|off]
启动方法
gbd program
gdb program core
同时调试一个运行程序和core文件
- gdb program pid
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程。
- 查询进程
查询正在调试的进程:info inferiors
切换调试的进程:inferior
添加新的调试进程:add-inferior [-copies n] [-exec executable]. - 常见命令
命令 功能
I 从第一行开始列出源码
break func 在函数func的入口处设置断点
break n 在第n行处设置断点
info break 查看断点信息
r 运行程序
n 单步执行
c 继续运行
p 打印变量值
bt 查看函数堆栈
finish 退出函数
shell 命令行 执行shell命令行
set args 指定运行时参数
show args 查看设置好的参数
show paths 查看程序运行路径
clear n 清除第n行断点
delete n 删除第n个断点
disable n 暂停第n个断点
enable n 开启第n个断点
step 单步调试如果有函数调用,则进入函数
list 简记为l,列出程序源代码,默认每次显示十行
list 行号 将显示当前文件以行号为中心的前后10行代码
list 函数名 将显示函数名所在函数的源代码
run 简记为r,运行程序,当遇到断点时,程序会在断点处停止运行。
回车 重复上一条命令
print a 将显示整数a的值
print name 将显示字符串name的值
watch 表达式 设置一个监视点一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。
kill 强制终止当前调试程序
help help命令将显示常用帮助信息
call 函数 调试函数
layout 用于分割窗口,可以一边查看代码,一边测试
quit 简记为q,退出gdb
set environment varname [=value] 设置环境变量。如:set env USER=hchen;
show environment [varname] 查看环境变量; - 调试多进程
以下面程序为例进行调试:
include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 void son_fun()
6 {
7
8 pid_t pid=getpid();
9 printf("son:%d\n",pid);
10 }
11 void father_fun()
12 {
13 pid_t pid=getpid();
14 printf("father:%d\n",pid);
15 }
16 int main()
17 {
18 pid_t id=fork();
19 if(id<0)
20 {
21 perror("fork");
22 exit (1);
else if(id==0)
25 {
26 son_fun();
27 }
28 else
29 {
30 father_fun();
31 }
32 return 0;
33 }
其他重要命令
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。
clone-inferior [-copies n] [infno]
复制n个编号是infno的inferior。如果不指定n的话,就只复制一个inferior。如果不指定infno,则就复制正在调试的inferior。
detach inferior infno
detach去掉编号是infno的inferior。注意这个inferior还存在,可以再次用run命令执行它。
kill inferior infno
kill掉infno号inferior。注意这个inferior仍然存在,可以再次用run等命令执行它
多线程调试
gbd默认支持调试多线程,跟踪主线程,子线程断点在create thread。
- 常见命令
info thread: 查看当前进程的线程
thread ID :切换调试的线程为指定ID的线程。
break file.c:100 thread all : 在file文件第100行处为所有经过第100行的线程设置断点。
set scheduler-locking off |on|step
在使用step或continue命令调试当前被调试线程的时候,其他线程也同时执行。
如果只让被调试程序执行,我们需要以下命令。
命令 含义
off 不锁定任何线程,也就是所有线程都执行,默认值。
on 只有当前被调试程序执行
step 在单步的时候,出来next过一个函数的情况(设置断点然后continue的行为)。
2. 调试程序
以下面程序为例进行调试:
void* thread1(void* arg)
{
printf("thread1, tid is %lu\n", pthread_self());
return NULL;
}
void* thread2(void* arg)
{
printf("thread2, tid is %lu\n", pthread_self());
return NULL;
}
int main()
{
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
gdb调试多线程多进程的更多相关文章
- GDB 调试多线程多进程
GDB是linux下的调试利器,在c/c++程序开发过程中必不可少的.这里总结一下多进程和多线程的调试方法和技巧. 多进程的调试: 如下示例 #include <sys/mman.h> # ...
- 使用gdb调试多线程程序总结
转:使用gdb调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为工作有了一些接触,简单作点记录吧. 先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程 ...
- Debugging with GDB 用GDB调试多线程程序
Debugging with GDB http://www.delorie.com/gnu/docs/gdb/gdb_25.html GDB调试多线程程序总结 一直对GDB多线程调试接触不多,最近因为 ...
- 【疑难杂症】gdb调试多线程程序报错:interrupted system call
一. cmake生成可调试版本的程序,该内容参考自https://www.linuxidc.com/Linux/2014-03/98622.htm 具体内容如下: 1, 使用CMAKE编译确实很方便. ...
- gdb 调试多线程 神贴
gdb 调试多线程如果目标进程已经core dump了,那么 gdb -c core xxx xxx是对应的程序文件.如果目标进程还在运行,通常此时用于调试线程死锁的情况.有两种方法一是 gdb ...
- GDB调试多线程
先介绍一下GDB多线程调试的基本命令. info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID. 前面有*的是当前调试的线程. th ...
- gdb调试多线程程序总结
阿里核心系统团队博客 http://csrd.aliapp.com/?tag=pstack Linux下多线程查看工具(pstree.ps.pstack) http://www.cnblogs.com ...
- 使用GDB调试产生多进程的程序
如果一个进程fork了多个进程,这时使用GBD工具对程序进行调试会如何呢? 实际上,GDB 没有对多进程程序调试提供直接支持.例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试 ...
- gdb 调试多线程
基本i threads 等操作略过,只谈线程同步.异步控制: 先点到,gdb attach到主线程t1 时,所有线程都会停止,所谓同步异步效果,是指在apply continue到所有线程之后, 再切 ...
随机推荐
- Nginx错误日志(error_log)配置及信息详解
Nginx错误日志信息介绍 Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(ngx_core_module)的参数,该参数的名字为error_log,可以放在Main区块中全局配 ...
- 锋利的NodeJS之NodeJS多线程
最近刚好有朋友在问Node.js多线程的问题,我总结了一下,可以考虑使用源码包里面的worker_threads或者第三方的模块来实现. 首先明确一下多线程在Node.js中的概念,然后在聊聊work ...
- 201871030102_崔红梅 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两人合作,练习结对编程2. 掌握Github协作开发程序的操作方法.3.阅读<现代软 ...
- 京东效率专家带你快速落地DevOps
行业内的公司纷纷在招聘DevOps工程师,企业的DevOps转型看起来迫在眉睫,公司内部也要设计和开发DevOps平台,DevOps已经成为了所有IT从业人员应知应会的必备技能. 为你提供一套清晰的D ...
- OkHttp:NoClassDefFoundError
1 问题描述 使用OkHttp时报错: Caused by: java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics at okh ...
- JDBC_08_解决SQL注入问题 (登录和注册)
解决SQL注入问题 只要用户提供的信息不参与sql语句的编译过程,那么尽管用户输入的信息中含有sql关键字那么也不会起作用了 要想使用户提供信息不参与sql语句的编译过程,那么必须使用 java.sq ...
- Jenkins 自定义构建结果
1. Jenkins 构建原理 2. 脚本执行失败立即停止执行 3. 脚本执行失败继续后面的执行但最终的结果是构建失败 1. Jenkins 构建原理 Jenkins 的构建成功和脚本执行成功是两个事 ...
- Linux(CentOS7)安装与卸载MySQL8.0图文详解
Mysql数据库的安装对于开发者来说,是我们必然会面对的问题,它的安装过程其实并不复杂,并且网络上的安装教程也非常多,但是对于新手来说,各种不同形式的安装教程,又给新手们带来了要选择哪种方式进行安装的 ...
- 进击中的Vue 3——“电动车电池范围计算器”开源项目
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/build-a-tesla-battery- ...
- CSS新特性contain,控制页面的重绘与重排
在介绍新的 CSS 属性 contain 之前,读者首先需要了解什么是页面的重绘与重排. 之前已经描述过很多次了,还不太了解的可以先看看这个提高 CSS 动画性能的正确姿势. OK,下面进入本文正题, ...