Linux·gdb调试命令和使用方法

news2025/2/22 13:41:43

基本命令

调试未运行的程序

$ gdb helloworld Reading symbols from helloWorld...(no debugging symbols found)...done.

如果没有调试信息,会提示no debugging symbols found。

如果是下面的提示:

Reading symbols from helloWorld...done.

则可以进行调试。

  • readelf查看段信息

例如:

$ readelf -S helloWorld|grep debug [28] .debug_aranges PROGBITS 0000000000000000 0000106d [29] .debug_info PROGBITS 0000000000000000 0000109d [30] .debug_abbrev PROGBITS 0000000000000000 0000115b [31] .debug_line PROGBITS 0000000000000000 000011b9 [32] .debug_str PROGBITS 0000000000000000 000011fc

helloWorld为文件名,如果没有任何debug信息,则不能被调试。

  • file查看strip状况

下面的情况也是不可调试的:

$ file helloWorld helloWorld: (省略前面内容) stripped

如果最后是stripped,则说明该文件的符号表信息和调试信息已被去除,不能使用gdb调试。但是not stripped的情况并不能说明能够被调试。

调试例如:

$ gdb helloWorld (gdb)

输入run命令,即可运行程序

调试启动带参程序

假设有以下程序,启动时需要带参数:

#include<stdio.h> int main(int argc,char *argv[]) { if(1 >= argc) { printf("usage:hello name\n"); return 0; } printf("Hello World %s!\n",argv[1]); return 0 ; }

编译:

$ gcc -g -o hello hello.c

这种情况如何启动调试呢?需要设置参数:

$ gdb hello (gdb)run 编程珠玑 Starting program: /home/shouwang/workspaces/c/hello 编程珠玑 Hello World 编程珠玑! [Inferior 1 (process 20084) exited normally] (gdb)

只需要run的时候带上参数即可。

或者使用set args,然后在用run启动:

$ gdb hello (gdb) set args 编程珠玑 (gdb) run Starting program: /home/hyb/workspaces/c/hello 编程珠玑 Hello World 编程珠玑! [Inferior 1 (process 20201) exited normally] (gdb)

调试正在运行的程序

如果程序已经运行了怎么办呢?

首先使用ps命令找到进程id:

$ ps -ef|grep 进程名

或者:

$ pidof 进程名

attach方式

假设获取到进程id为20829,则可用下面的方式调试进程:

$ gdb (gdb) attach 20829

接下来就可以继续你的调试啦。

可能会有下面的错误提示:

Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf ptrace: Operation not permitted.

解决方法,切换到root用户:

将/etc/sysctl.d/10-ptrace.conf中的

kernel.yama.ptrace_scope = 1

修改为

kernel.yama.ptrace_scope = 0

直接调试相关id进程

还可以是用这样的方式gdb program pid,例如:

gdb hello 20829

或者:

gdb hello --pid 20829

已运行程序没有调试信息

为了节省磁盘空间,已经运行的程序通常没有调试信息。但如果又不能停止当前程序重新启动调试,那怎么办呢?还有办法,那就是同样的代码,再编译出一个带调试信息的版本。然后使用和前面提到的方式操作。对于attach方式,在attach之前,使用file命令即可:

$ gdb (gdb) file hello Reading symbols from hello...done. (gdb)attach 20829

错误文件调试分析

调试core文件

当程序core dump时,可能会产生core文件,它能够很大程序帮助我们定位问题。但前提是系统没有限制core文件的产生。可以使用命令limit -c查看:

$ ulimit -c 0

如果结果是0,那么恭喜你,即便程序core dump了也不会有core文件留下。我们需要让core文件能够产生:

$ ulimit -c unlimied #表示不限制core文件大小 $ ulimit -c 10 #设置最大大小,单位为块,一块默认为512字节

上面两种方式可选其一。第一种无限制,第二种指定最大产生的大小。

调试core文件也很简单:

$ gdb 程序文件名 core文件名 bt 可以查看函数调用栈

调试多进程

  • 调试父进程:set follow-fork-mode parent(默认)
  • 调试子进程:set follow-fork-mode chiled
  • 设置调试模式:set detach-on-fork [on|off],缺省是on,表示调试当前进程的时候,其它的进程继续运行,如果用off,调试当前进程的时候,其它的进程被gdb挂起。
  • 查看调试的进程:info inferiors
  • 切换当前调试的进程:inferior 进程 id

调试多线程

  • 查看当前运行的进程:ps -aux | grep 进程名
  • 查看当前运行的轻量级进程:ps -aL | grep 进程名
  • 查看主线程与新线程的关系:pstree -p 主线程id
  • 查看线程:info threads
  • 切换线程:thread 线程id
  • 只运行当前线程:set scheduler-locking on
  • 运行全部的线程:set scheduler-locking off
  • 指定某线程执行某gdb命令:thread apply 线程id cmd
  • 全部的线程执行某gdb命令:thread apply all cmd

 

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

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

相关文章

Windows11 环境下 Nginx 安装部署教程

一、Nginx 介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。Nginx 是一种轻量级的Web服务器&#xff0c;可以作为独立的服务器部署网站&#xff08;类似Tomcat&#xff09;&#xff0c;应用非常广泛&#xff0c;特别是现…

【method】ADMM-CSNet | 一种图像压缩感知重建的深度学习方法(1)- 方法解析

#! https://zhuanlan.zhihu.com/p/644157062 【method】ADMM-CSNet | 一种图像压缩感知重建的深度学习方法&#xff08;1&#xff09;- 方法解析 文章目录 【method】ADMM-CSNet | 一种图像压缩感知重建的深度学习方法&#xff08;1&#xff09;- 方法解析摘要广义压缩感知模型…

用宏定义完成整数的二进制位的奇偶位互换

代码如下&#xff1a; #include <stdio.h> #define SWAP(num) (((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << 1))int main() {int num 1010;printf("%d\n", num);printf("%d\n", SWAP(num));return 0; }思路如下&…

麒麟v10部署Nginx

1.解压&#xff1a;tar -xvf nginx-1.18.0.tar.gz 2.进入目录&#xff1a;cd nginx并执行脚本./configure 3.执行make 4.执行make install 5.安装目录在&#xff1a;/usr/local/nginx&#xff0c;然后再进入/usr/local/nginx/sbin启动nginx服务&#xff0c;执行./nginx&a…

3Ds max材质制作教程:创建金、银、铜金属材质

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 如果您不想完成本教程中的所有步骤&#xff0c;可以通过本教程底部的链接下载 3D Studio Max 的 matlib &#xff08;.mat&#xff09; 文件。 注意&#xff1a;单击每个步骤中的缩略图可查看更大的屏幕截…

Traefik v3.0 Docker 全面使用指南:基础篇

本篇文章聊聊如何通过 Docker 容器使用 Traefik&#xff0c;进行稳定的 Traefik 服务的部署。 写在前面 距离 Traefik v2.0.0 的发布&#xff0c;不知不觉快四年了&#xff0c;在过去的四年里&#xff0c;我写过非常多和 Traefik 相关的实践内容&#xff0c;感兴趣的同学可以…

udx大带宽大延迟网络与xquic bbr, tcp bbr实测比较

quic在其白皮书中声称可以在大延迟大带宽网络中表现良好&#xff0c;为此我对比过目前xq,lsq,pq几种实现&#xff0c;因为这些都是开源项目通过不断的折腾&#xff0c;向这方面研究的同学索取不同版本的实现进行实际测试。 经过&#xff0c;对不同国家的主机&#xff0c;到国内…

问题解决:启动Gazebo出现Error in REST request报错的问题

环境&#xff1a; Ubuntu18.04 ROS melodic Anaconda3 在安装完ROS之后&#xff0c;第一次打开gazebo&#xff0c;就遇到了这一红色的报错&#xff1a; 在网上找到了解决方法&#xff1a;修改.ignition/fuel/config.yaml 文件 首先&#xff0c;新建终端&#xff0c;打开上…

功能丰富的 Markdown 笔记工具:FSNotes Mac中文版图文安装教程

FSNotes Mac版是Mac平台上一款纯文本笔记本管理器&#xff0c;FSNotes for mac中文版支持Markdown、RTF等格式&#xff0c;轻松查看和编辑数据&#xff0c;还可以将数据存储在文件系统中&#xff0c;同时具备iCloud同步功能&#xff0c;使用非常便捷。 FSNotes for mac官方介绍…

使用semanage管理SELinux安全策略

semanage命令用于管理SELinux的策略&#xff0c;格式为“semanage [选项] [文件]”。 SELinux服务极大地提升了Linux系统的安全性&#xff0c;将用户权限牢牢地锁在笼子里。semanage命令可以设置文件、目录的策略&#xff0c;还可以管理网络端口、消息接口。 常用参数&#xf…

IDEA导入项目后文件出现红色小时钟的标志解决办法

报错问题&#xff1a;IDEA导入项目后文件出现时钟的标志 如下图所示&#xff1a; 问题原因&#xff1a;没有将项目添加为Maven项目 解决办法&#xff1a;找到项目的xml文件&#xff0c;鼠标右键 Add as Maven project 即可&#xff0c;将文件添加到Maven项目

通过 MasterGo 权限设置实现精细化管理,让你的工作更清晰

在日常办公中&#xff0c;当设计资产汇总到一个平台时&#xff0c;由于项目复杂、协作人员众多&#xff0c;会衍生出多种权限设置需求。比如说&#xff1a;谁可以编辑哪些文件&#xff1f;谁只能查看哪些文件&#xff1f;同团队不同成员的权限有哪些&#xff1f;而MasterGo作为…

PHP 判断数组是否是多维

文章目录 什么是数组&#xff1f;使用array()函数使用方括号[] 什么是多维数组&#xff1f;如何判断数组是不是多维数组&#xff1f;使用递归方式判断使用PHP内置函数count()函数判断 总结 在PHP中&#xff0c;我们经常需要对数组进行操作&#xff0c;包括判断数组是不是多维数…

辅助驾驶功能开发-功能规范篇(22)-7-L2级辅助驾驶方案功能规范

1.3.7 AEB 系统功能定义 1.3.7.1 车辆&#xff08;纵向&#xff09;AEB 系统 1.3.7.1.1 状态机 1&#xff09;前碰撞预警系统状态机 2&#xff09;AEB 功能状态机&#xff08;Prefill、ABA、制动辅助为并行关系&#xff09; 1.3.7.1.2 信号需求列表 1.3.7.1.3 系统开启关闭…

ceph集群的维护

ceph集群的维护 1、ceph集群常用命令 1.1查看集群的状态 rootceph-mon1:~#ceph -s#或者 rootceph-mon1:~#ceph health detail #显示集群状态的详细信息1.2查看所有存储池的列表 rootceph-mon1:~# ceph osd pool ls1.3查看所有存储池的编号 rootceph-mon1:~# ceph osd ls…

Echart社区

https://www.makeapie.cn/echartsmakeapie echarts图表可视化案例, 分享你的可视化作品https://www.makeapie.cn/echarts

【go】xorm分类统计及多表联查

文章目录 1 分类统计2 多表联查 1 分类统计 1 sql SELECT grade_protection_level AS type, count(grade_protection_level) AS count FROM vital_7jvebmrryff3_asset WHERE (field_group 应用信息)AND (asset_life_cycle 正式)AND (status 1) GROUP BY grade_protection…

棕榈酰三肽-1-------有效逆转衰老,减少面部皱纹

简介 皮肤真皮中胶原蛋白减少被认为是人体衰老形成皱纹的主要原因&#xff0c;因此&#xff0c;如果能够促进皮肤合成更多的胶原蛋白&#xff0c;那么将会有效逆转衰老从而减少皱纹。 The reduction of collagen in the dermis of the skin is believed to be the main cause…

【C++】-list的模拟实现

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …