当前位置: 首页 > news >正文

gdb调试

gcc -o app test.c -ggdb3 (可以最大限度的包含调试信息)
gdb ./app 
gdb 运行时设置命令行参数:(gdb)    run  命令行参数   或者  (gdb)  set args 命令行参数
打印变量的值:    p 变量  
断点设置:
  b    行号 或者b    文件名:行号  或者 b function_name 以函数名设置断点
  info breakpoints     查看断点信息
删除断点
clear 删除这行的断点 或者 clear 函数名 : 删除该函数的断点
delete b_id1 b_id2 ... : 删除指定编号的断点

finish 退出函数//finish:运行到当前函数结尾
until num 执行到某一行停下
until: 跑完一个循环,到循环外的下一行

start开始运行程序, 停在main函数入口处, 然后可next或step单步执行
reverse-next 逆向调试(不支持多线程)

gdb    或者    gdb -p pid 调试正在运行的进程
attch  pid(运行中程序的pid)
bt(在gdb调试程序的时候,用bt命令查看栈信息)
gdb中c为continuing
frame n   n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层  ,最顶层的栈就是当前栈


info threads 显示当前可调试的所有线程,每个线程会有一个GDB为其分配的ID,后面操作线程的时候会用到这个ID。 前面有*的是当前调试的线程。
thread ID 切换当前调试的线程为指定ID的线程。
break thread_test.c:123 thread all 在所有线程中相应的行上设置断点
thread apply ID1 ID2 command 让一个或者多个线程执行GDB命令command。 
thread apply all command 让所有被调试线程执行GDB命令command。
set scheduler-locking off|on|step 估计是实际使用过多线程调试的人都可以发现,在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。 step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。gdb土办法调多线程,发个信号让进程stop住,然后gdb进去看看每个线程的backtrace,然后再让进程继续跑,再取样,多次取样看看哪个地方出现最多。

info symbol 0x807a505 : 查看当前内存地址0x807a505所指向的函数符号,此命令对查看 回调函数指针所指向的具体函数名 非常方便。

info f 更相信的显示当前栈信息

info line 行号, 函数名, 文件:行号, 文件:函数名, 查看相应函数或者行号源码在内存中地址
info line *0x807a505, 获取内存地址处源码, 16进制地址前必选加0x, 否则会当成十进制处理

list *0x807a505  查看0x807a505附近代码10行
list 38 查看38行代码周围的十行, 即33-42
list - 查看上一个命令查看的前十行及23-32
list main 查看main函数周围10行
list main.c:33      list main.c: main


调试的跳步解决:

是qt或者gdb调试的时候发现代码的执行总是跳来跳去的,这是因为编译的时候加入了优化选项。修改configure,把里面的所有 O2 都去掉,再编译、调试,既可解决此问题或者 gcc 输出改为-O


gdb 查看结构体
set  print  pretty on       //设定美化显示过程
ptype p_type  或者pt p_type打印结构体的定义
p  *p_type 打印结构体中变量值, p  p_type->a   查看结构体中成员值
whatis p_type  打印p_type类型

如用p ((struct NewStruct *)tmp_p)->a 出现
no struct type named NewStruct
需在编译时加     -fno-eliminate-unused-debug-types      选项  


gdb 调试问号
问题:关于gdb调试core文件总是一堆问号的问题
ulimit -a
查看是否打开core文件生成
vim /etc/profile    加入ulimit -c unlimited   保存    source /etc/profile     或者.  /etc/profile
问题描述:已经在编译选项中加入了-g,但是查看core文件时,还是一堆问号,使用的命令为:gdb -c core
解决方案:由于gdb -c core这样的使用在有些系统下支持不是很好,所以推荐用如下两种方法:

1)gdb app
(gdb) core-file core

2)gdb -c core app

3) gdb ./exe app

而其中第二种方法在某些系统上也是不好用的,所以就用第一种即可。

gdb 调式动态库:
需在动态库编译的时候加上-g 选项, 同时主程序也在编译时加-g选项, gdb进入时先在mian函数处打断点, 再在动态库函数处打断点
用s命令便可调试进动态连接库内部, 若看见的是调用的什么库, 可list *地址查看文件函数

相关文章:

  • 异或运算
  • 快速枚举因子(约数)
  • 欧拉函数 线性筛法
  • 【条件概率】Headshot, ACM/ICPC NEERC 2009, UVa1636
  • 【数学专题】 卡特兰数
  • 【组合数学】Critical Mass, UVa580
  • 常用算法和数据结构的复杂度速查表
  • 【CodeChef】Just multiply
  • 【CodeChef】LCH15JGH Many bananas
  • 【CodeChef】 Queries on the String
  • 【BZOJ 1051】 受欢迎的牛 【Tarjan】
  • 【数学期望】Crossing Rivers, ACM/ICPC Wuhan 2009, UVa12230
  • 【数学期望】Candy, ACM/ICPC Chengdu 2012, UVa1639 【精度】
  • 【积分】【概率】Probability, UVa11346
  • 【BZOJ 4571】美味 【区间异或最大值】【主席树】【贪心】
  • 分享一款快速APP功能测试工具
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 2017 年终总结 —— 在路上
  • es的写入过程
  • Java知识点总结(JavaIO-打印流)
  • Leetcode 27 Remove Element
  • vue-loader 源码解析系列之 selector
  • 反思总结然后整装待发
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 深度学习在携程攻略社区的应用
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 我从编程教室毕业
  • 优化 Vue 项目编译文件大小
  • 如何在招聘中考核.NET架构师
  • ​Linux·i2c驱动架构​
  • "无招胜有招"nbsp;史上最全的互…
  • (1)(1.9) MSP (version 4.2)
  • (52)只出现一次的数字III
  • (a /b)*c的值
  • (Git) gitignore基础使用
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (转)jQuery 基础
  • (转)winform之ListView
  • 、写入Shellcode到注册表上线
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .Net core 6.0 升8.0
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • /dev/sda2 is mounted; will not make a filesystem here!
  • ::前边啥也没有
  • @Pointcut 使用
  • @RequestMapping-占位符映射
  • [2544]最短路 (两种算法)(HDU)
  • [Android] Upload package to device fails #2720
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C/C++] -- 二叉树
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++]类和对象(中)