【面试】GDB调试

2023-11-05

用GDB调试多进程程序

  如果一个进程通过fork系统调用创建了子进程,gdb会继续调试原来的进程,子进程则正常运行。那么该如何调试子进程呢?

单独调试子进程

  子进程从本质上说也是一个进程,因此我们可以用通用的gdb调试方法来调试他。
  举例来说如果要调试一个服务器中的某一个子进程,我们可以先运行服务器,然后找到目标子进程的PID,再将其附加(attach)到gdb调试器上,具体操作为:
  

$ps -ef | grep 进程名
//通过上述命令的到待调试进程的PID
$gdb
(gdb) attach "PID"
//上面的“PID”即待调试进程的pid

使用调试器选项follow-fork-mode

  gdb调试器的选项follow-fork-mode允许我们选择程序在执行fork系统调用后是继续调试父进程还是调试子进程。
  其用法如下:
  

(gdb)set follow-fork-mode mode

  上面的mode可选parent或child,分别表示调试父进程和子进程。
  举例:
  

$gdb XX
(gdb) set follow-fork-mode child
(gdb) b process.h:264
//打断点

用gdb调试多线程程序

  gdb有一组命令可辅助多线程程序的调试。

  • info threads

      显示当前可调试的所有线程。gdb会为每个线程分配一个ID,我们可以使用这个ID来操作对应的线程。ID前面有“*”的线程是当前被调试的线程。

  • thread ID

      调试目标ID指定的线程。

  • set scheduler-locking[off|on|step]

      调试多线程程序时,默认除了被调试的线程在执行外,其他线程也在继续执行,但有的时候我们希望只让被调试的线程运行。这可以通过这个命令来实现。
      该命令设置sceduler-locking的值:
      off表示不锁定任何线程,即所有线程都可以继续执行,这是默认值。
      on表示只有当前被调试的线程会继续执行。
      step表示在单步执行的时候,只有当前线程会执行。
      

(gdb) info threads
//查看线程信息,当前被调试的是那个线程
(gdb) set scheduler-locking on
//不执行其他线程,锁定调试对象
(gdb)thread 2
//将调试切换到子线程,其ID为2

  关于调试进程池或线程池程序的一个不错的方法:
  先将池中的进程个数或线程个数减少至一,以观察程序的逻辑是否正确,然后逐步增加进程或线程的数量,以调试进程或线程的同步是否正确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【面试】GDB调试 的相关文章

  • 如何检测并找出程序是否陷入死锁?

    这是一道面试题 如何检测并确定程序是否陷入死锁 是否有一些工具可用于在 Linux Unix 系统上执行此操作 我的想法 如果程序没有任何进展并且其状态为运行 则为死锁 但是 其他原因也可能导致此问题 开源工具有valgrind halgr
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • Linux 内核标识符中前导和尾随下划线的含义是什么?

    我不断遇到一些小约定 比如 KERNEL Are the 在这种情况下 是内核开发人员使用的命名约定 还是以这种方式命名宏的语法特定原因 整个代码中有很多这样的例子 例如 某些函数和变量以 甚至 这有什么具体原因吗 它似乎被广泛使用 我只需
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是

随机推荐

  • C++ opencv处理kinect红外数据和彩色数据

    kinect好像已是明日黄花 但现在需要用这个做交互的人还不少 要做手势识别 于是入手一枚二手kinect2 0 入坑玩玩 做手势识别 直觉上要用opencv 从网上搜的资料来看 大多是通过openNi来操作kinect 而且要openNi
  • grpc-go源码剖析三十五之滑动窗口基本介绍以及整体流程图介绍?

    已发表的技术专栏 0 grpc go protobuf multus cni 技术专栏 总入口 1 grpc go 源码剖析与实战 文章目录 2 Protobuf介绍与实战 图文专栏 文章目录 3 multus cni 文章目录 k8s多网
  • 使用aircrack-ng套件破解wifi密码

    一 准备工作 1 需要有一个无线网卡 需要支持monitor模式 2 Kali系统 自行单独安装套件也可以 3 一个完善的密码字典 二 监听工作 首先将无线网卡连接到kali iwconfig 查看是否连接成功 airmon ng 可以查看
  • Vim 小技巧:自动写入文件头

    Vim 小技巧 情景一 自动写入文件头 在编写 C 程序时 总有一些东西会在每个头文件中出现 比如 ifndef lt File Name MACRO gt define lt File Name MACRO gt endif lt Fil
  • STM32H7 LwIP 主RAM选择 DTCM AXIRAM UDP 收发问题

    STM32H7 LwIP 主RAM选择 DTCM AXIRAM UDP 这段时间一直在调试STM32H743 期间掉进了不少坑 最大的坑还是网络这一块 例如LwIP移植 已经有前人踩过的坑 我以为我能避免 结果自己还是踩了 耽误了不少时间
  • Android --- 控件属性的属性值为 @null

    1 控件属性值为 null 1 RadioButton里面的属性android button null 是去掉前面的圆点 2 android background null 是控件自带的背景设为空
  • 《深入浅出数据分析》第九章——R语言

    文章目录 记录第一次接触R语言 一 R语言下载安装 二 运行 三 补充 1 加载csv文件 2 hist函数 记录第一次接触R语言 深入浅出数据分析 第九章讲到R语言 在这记录一下 就当给自己做的笔记 一 R语言下载安装 安装地址 http
  • mybatis是如何集成到spring的之托管mapper接口

    前言 mybatis集成到spring可以参考spring mvc集成mybatis进行数据库访问 其中mybatis集成到spring最重要的两个配置分别是SqlSessionFactoryBean和MapperScannerConfig
  • C++学习(七十四)有关三维压缩库draco

    一 是什么 Draco是谷歌Chrome 媒体团队在2017年1月发布的一个3D图形开源压缩库 提供了多种算法进行压缩和解压缩 旨在大幅加速 3D 数据的编码 传输和解码 因为研发团队的 Chrome 背景 这个开源算法的首要应用对象是浏览
  • 【编译原理】Java手写一个词法分析器

    在编程的世界中 每一个code都是一个符号 我们程序员用这些符号来表达出模型 1 1 2 上面的代码中1就是一个符号 它对应的模型是数量 比如一根手指 一根棒棒糖 当我们看到这个像小旗子的符号之后 我们就知道它对应着一根手指 此时你就相当于
  • Vue3 中引入wangeditor富文本编辑器

    文章目录 前言 一 引入 二 呈现到页面 1 原型 2 可视化界面 3 获取内容 4 配置工具栏 总结 前言 我花一些时间做了一个博客 需要一个引入编辑器 让我好在网页上就能编辑文章 这里中没有配置图片的上传功能 如有需要请自行配置 一 引
  • 远程网络读取服务器文件是否存在,linux 读取远程服务器文件是否存在

    linux 读取远程服务器文件是否存在 内容精选 换一换 云服务器网络异常 防火墙未放行本地远程桌面端口 云服务器CPU负载过高等问题均可能导致云服务器无法正常登录 本节操作介绍无法登录Windows弹性云服务器的排查思路 当您的云服务器无
  • 【Python】基于wxauto的超简单微信机器人

    前言 我是一个python初学者 一直想做一个微信版类似qq的群助手 我尝试去百度过 python微信机器人 之类的搜索 但得到的结果几乎都是使用 itchat wxpy 之类的库通过网页版微信去实现行为的 但腾讯在2019年7月份开始 彻
  • java.net.SocketException: Socket closed 解决方式

    问题背景 客户端连接服务器 发送一个请求 捕获响应信息 建立连接 Socket socket new Socket socket connect new InetSocketAddress InetAddress getLocalHost
  • 方差分析 球形检验_不等距重复测量方差分析

    作者 红豆牛奶 封面 自己想吧 在进行重复测量方差时 测量的间隔大多数的等距的 但有时测量的间隔却是不等距的 若用等距测量的方法分析 会使结果不准确 此时就需要手动编程一下 不要一提到编程就觉得很难哦 看完此篇文章 原来它竟如此简单 重复测
  • 以前写SpringMVC的时候,如果需要访问一个页面,必须要写Controller类,然后再写一个方法跳转到页面,感觉好麻烦,其实重写WebMvcConfigurerAdapter中的addViewC...

    以前写SpringMVC的时候 如果需要访问一个页面 必须要写Controller类 然后再写一个方法跳转到页面 感觉好麻烦 其实重写WebMvcConfigurerAdapter中的addViewControllers方法即可达到效果了
  • CSS的样式注释(部分)

    a link text decoration none color white a visited text decoration none color white a hover text decoration underline col
  • RT-Thread 断言:assertion failed at function:rt_mutex_take 等

    断言 断言是什么 https www cnblogs com thisway p 5558914 html ASSERT 是一个调试程序时经常使用的宏 在程序运行时它计算括号内的表达式 如果表达式为FALSE 0 程序将报告错误 并终止执行
  • 【ETL】常见的ETL工具(含开源及付费)一览和优劣势分析?

    一 Kettle Kettle 中文名称叫水壶 该项目的概念是把各种数据放到一个壶里 然后以一种指定的格式流出 Kettle是一款国外开源的ETL工具 纯java编写 可以在Window Linux Unix上运行 无需安装 数据抽取 高效
  • 【面试】GDB调试

    用GDB调试多进程程序 如果一个进程通过fork系统调用创建了子进程 gdb会继续调试原来的进程 子进程则正常运行 那么该如何调试子进程呢 单独调试子进程 子进程从本质上说也是一个进程 因此我们可以用通用的gdb调试方法来调试他 举例来说如