本文链接:https://blog.csdn.net/weixin_40313634/article/details/88619906 实验楼值GDB常用命令实战课程学习记录 1. 安装工具: sudo apt-get install gdb 2. 编译可调式程序: gcc bugging.c -o bugging -g -m32 -o: 生成的可执行文件的名字。 -g: 生成的程序允许gdb 调试。 -m32:生成32位的程序。默认,程序位数和OS位数相同。 编译32位程序时报错:fatal error: sys/cdefs.h: 没有那个文件或目录。 调试: 开始调试:gdb bugging 结束调试:quit 断点在循环中时: enable once Num // 断点hit 一次后,失效。 设置断点 info breakpoints 显示断点信息 delete d 删除断点 print p 打印值 until u 执行到指定行 continue c 继续运行 run r 执行程序,启动调试
在停止点查看当前程序的状态:变量、寄存器的值 4. 回车在GDB相当于重复上一个命令。 启动GDB运行程序 运行GDB调试a.out程序有以下几种方式: 方式一:直接运行gdb,然后在gdb中执行“file a.out”加载程序。 “gdb a.out 19475”来调试运行中的a.out。 通过cd命令可以更改目录,pwd显示当前所在目录 准备就绪后就可以真正开始用GDB来调试程序了。 栈溢出;4. 地址保护。
理解 自己总结 gdb会记住历史命令,按一次n,回车以后再回车还是n -g才是debug debug才有调试信息,默认的没有 mycode是可执行程序,再gdb这个可执行程序 q退出/quit list 和取消常显示类似,不能直接取消那个字母,要用取消编号的方式 打完断点后,r在编号1的位置停下了,next/n(n是逐过程,相当于F10),按一下就就进入了下一行,并且会跳过空行 命中次数变成1了 s进入过程,逐行调试 F11相当于,s进入函数后如果没有函数需要进入了,n和s就一样了F10和F11,也是如此 p相当于查看窗口 display i,可以常显示内容,边调试,边显示 取消常显示,不能直接取消那个字母,要用取消编号的方式
gdb的启动 准备内容 一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。 gdb program core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。 gdb program 1234 如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。 3.2 方式二:f 在过程中,f 命令的功能是帮助了解当前执行的代码所在的位置,特别是在调试过程中出现错误时,可以帮助确认错误发生的地点。 4.
简介 GDB是GCC的调试工具。其功能如下: 启动程序,使程序按自定义形式运行; 使程序停止指定断点位置; 程序停止后,检查程序执行中的相应情况; 动态改变程序执行环境。 gdb调试 能进行GDB调试,一般在编译过程中,需使用-g参数。如果不使用-g参数,则在gdb调试过程中,将不能得到程序的函数名、变量名等信息,而只能看见运行时内存地址。 举例如下: 启动gdb调试的方法有以下三种: 常用的调试有以下几种: b <行号> // 停在程序的指定一行 b <函数名称> // 停在程序的某个函数处 b *<函数名称> // 停在编译器生成的prolog q:退出gdb调试环境。 help [命令名称]:gdb帮助命令,提供对GDB各种命令的解释说明。 如果指定了“命令名称”参数,则显示该命令的详细说明;若果没有指定参数,则分类显示所有GDB命令,共用户进一步浏览和查询。 cd dir:运行GDB,使用dir作为gdb的工作目录。
本文以C程序为例,介绍GDB启动调试的多种方式。 哪类程序可被调试 对于C程序来说,需要在编译时加上-g参数,保留调试信息,否则不能使用GDB进行调试。 ,不能使用gdb调试。 需要设置参数: 1$ gdb hello 2(gdb)run 编程珠玑 3Starting program: /home/shouwang/workspaces/c/hello 编程珠玑 4Hello 或者使用set args,然后在用run启动: 1gdb hello 2(gdb) set args 编程珠玑 3(gdb) run 4Starting program: /home/hyb/workspaces 对于attach方式,在attach之前,使用file命令即可: 1$ gdb 2(gdb) file hello 3Reading symbols from hello...done. 4(gdb)attach
GDB调试 GDB是GUN发布的一个强大的程序调试工具,也是Linux程序员不可或缺的一大利器。 安装GDB 注意安装你所需要的版本。 /configure make make install ---- 启动GDB 使用GDB的前提。 gcc -g hello.c -o hello 启动GDB调试。 s ---- 监视变量 print 调试程序最基本的需求就是监视变量的值,可以使用print命令,缩写为p,显示指定变量的值。 set var count = 4 ---- 查看堆栈情况 bt 每次调用一个函数,函数的地址、参数、以及内部变量都会被压入栈中,运行时的堆栈信息对于程序员非常重要,使用"bt"命令可以看到当前运行时栈的情况 bt ---- 退出GDB quit 调试完毕后,使用quit命令,缩写为q,退出gdb程序。 q
如果使用gdb来调试,这种问题就可以迎刃而解了。gdb 可以完全操控程序运行,让程序走就走,让程序暂停就暂停,还可以随时查看程序运行时内部变量的值等信息。 使用 gdb 调试程序必须保证符合以下两个条件。 程序可以正常编译通过 程序编译时,必须用 -g 选项 // 加入 -g 选项时程序可以被调试 gcc main.c -o main -g 【开始调试】 要调试一个程序,你只需要输入命令 “gdb 被调试程序名 ” 就可以了,如 gdb main 【调试中列出源码】 当进入 gdb 调试状态后,程序会等待你输入调试的命令,此时,你可以输入 list 命令(也可以使用简写 l),列出程序的源码,来决定对哪一个逻辑进行调试 如下: (gdb) list 1#include <stdio.h> 2#include <unistd.h> 3 4int main(int argc, char* argv[]) 5{ 6pid_t
记录一些GDB调试相关的东西。 coredump设置无限大小。 如下:就是自动将coredump文件进行调试,会打印出来调用堆栈。可以自行重定向到指定文件中,方便统计问题。 MobileServer:是调试程序。 整了一个脚本: echo "GDB调试工具. gdb --batch --quiet -ex "thread apply all bt full" -ex "quit" $EXE_NAME $core_file_new > $outFile cat
以前在IDE调试的话,就很容易设置断点,查看参数值,到了 linux 下就变得比较麻烦了。 目前觉得比较重要的就是: 1.设置断点: gdb命令 break,也可以用 b 。 比如, b cyc::TcpClient::onMessage 2.查看参数 gdb命令 print,也可以 p。方法 p para.显示一次。 3.一直显示 gdb命令 display,方法 display para。 取消的话 undisplay 编号 4.列出信息 gdb命令 info,info break, info display 5.调试 单步调试 n,进入函数的单步调试 s,跳到下一个断点 c 6.读取文件 gdb命令 file , file path. 7.执行 gdb 命令 run, run args. 8.显示代码 gdb 命令 list,list [行号] 之后可以按 Enter 继续显示
前言 前面通过《启动调试》,《断点设置》,《变量查看》,我们已经了解了GDB基本的启动,设置断点,查看变量等,如果这些内容你还不知道,建议先回顾一下前面的内容。 在启动调试设置断点观察之后,没有我们想要的信息怎么办呢?这个时候,就需要单步执行或者跳过当前断点继续执行等等。而本文所说的单步调试并非仅仅指单步执行,而是指在你的控制之下,按要求执行语句。 num次,就达到继续执行n行的效果了: $ gdb gdbStep #启动调试 (gdb)b 25 #将断点设置在12行 (gdb)run #运行程序 Breakpoint $ gdb gdbStep #启动调试 (gdb) b 25 #在12行设置断点 Breakpoint 1 at 0x4005d3: file gdbStep.c, line 25. 跳过执行--skip skip可以在step时跳过一些不想关注的函数或者某个文件的代码: $ gdb gdbStep (gdb) b 27 Breakpoint 1 at 0x4005e4: file
环境准备 linux操作系统:物理机,云服务器,虚拟机 c++开发调试环境准备 安装gcc,g++,gdb 在ubuntu平台: apt install gcc g++ make gdb 在centos 平台: yum install gcc gcc-c++ make gdb linux下的调试工具gdb https://www.sourceware.org/gdb/ 代码 https://github.com -g参数,就没有调试信息,调试比较的困难gdb的使用1.对文件进行gdb调试: gdb +文件名 **makefile带-g参数的** ! [在这里插入图片描述](https://img-blog.csdnimg.cn/229ab7426bf1404f969778099459e6d4.png) **makefile不带-g参数** ! [在这里插入图片描述](https://img-blog.csdnimg.cn/e003e3e522d24bd283779e4fa9182101.png) ### 3.设置断点命令:break或者简写为
expected... 1 : #include <stdio.h> 2 : #include <stdlib.h> 3 : int main(int argc, char **argv) 4 libc.so.6 #2 0x4007ef51 in fgets () from /lib/libc.so.6 #3 0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10 #4 0x40037f5c in __libc_start_main () from /lib/libc.so.6 We are only interested ) frame 3 #3 0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10 10 fgets(buf, 1024, main (argc=1, argv=0xbffffaf4) at segfault.c:8 8 buf = malloc(1<<31); We're going to check
@TOC Linux GDB 调试 一、初识 GDB GDB 是一个开源的、功能强大的调试工具,主要用于调试 C、C++ 等语言编写的程序。 4. 4. 查看寄存器内容 在某些情况下,你可能需要查看寄存器的内容,可以通过以下命令: info registers 它会列出所有寄存器的名称和当前值,这对于底层调试非常有帮助。 5. 七、退出 GDB 完成调试后,可以通过以下命令退出 GDB: quit 或者: exit 八、GBD基本命令汇总 启动 GDB gdb :启动 GDB 并加载要调试的程序。 gdb :加载程序和核心转储文件进行调试。 gdb --args :加载程序并传递参数。 设置断点 break :在指定函数处设置断点。
GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学。代码借用的是卢肖明同学的代码进行调试运行。 GCC编译 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的 可见此时主函数的栈基址为0xffffd068,用x(examine)指令查看内存地址中的值,但目前%esp所指堆栈内容为0,%ebp所指内容也为0 用i r指令查看各寄存器的值 依次如下指令调试汇编代码 总结反思 这次学习让我对于gdb有了更加深刻地认识,设置断点是我们在进行编写代码时在整体编译没有问题,但是却无法得到我们想要的结果时所进行分段纠错步骤,这次的实践让我对于堆栈变化了有了更加深刻的理解,在使用终端三件工具编程时 gdb调试分析汇总表 ? ?
gdb调试 复习并整理gdb 1. 调试准备 被调试的程序需要生成调试符号信息,即在gcc/g++编译时加上-g选项。 启动gdb调试的方法 直接调试目标程序 gdb filename # filename为要启动的调试程序名称 attach到进程 gdb attach pid #attach到pid对应的进程 调试core 4. gdb调试多线程程序 4.1 调试多线程程序的方法 先gdb让程序跑起来,然后Ctrl+C中断程序,使用Info threads命令查看当前进程下有多少线程在运行。 5. gdb调试多进程程序 5.1 方法一 先在一个shell窗口中调试父进程,等待子进程被fork出来后,再开启另外一个shell窗口使用gdb attach命令将gdb attach到子进程上。 ) 5.2 方法二 gdb调试器提供了一个follow-fork选项,通过set follow-fork mode设置一个进程fork处新的子进程时,gdb时继续调试父进程(取值parent)还是继续调试子进程
GDB 是一个由 GNU 开源组织发布的 *.nix 下的、基于命令行的一款比较知名的程序调试工具。 GDB 有着相当多的命令,但是常用的只有大概十个左右。 gdb命令一般可以使用 gdb program 或者使用 gdb progrma core 。如果想对正在执行的进程进行调试,则可以使用 gdb -p 123 。 常见命令 命令 解释 示例 file <文件名> 加载被调试的可执行程序文件。因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径。 (gdb) file gdb-sample r run的简写,运行被调试的程序。如果此前没有下过断点,则执行完整个程序;如果有断点,则程序暂停在第一个可用断点处。 (gdb) r c Continue的简写,继续执行被调试程序,直至下一个断点或程序结束。
GDB是在Linux命令行下对C/C++的程序进行调试常用的一个命令, 现将平时记录在本子上的笔记整理记录一下. ,相关命令为: break [函数名,行数或者指令地址] [condi] 在指定地方加上断点 例: (gdb) set $counter = 0 (gdb) break 26 if ++$counter 会依次运行列表中的命令: commands [bnums] …command list… end 二、单步调试 1)基本命令: *step:*运行下一步(即step into,进入调用的函数体内 如: set {int}0x83040 = 4; //将4存储到地址0x83040中 3)跳转 jump [location] location可以是行号或者地址。 注意jump命令仅仅改变pc的值,而不改变当前栈帧、堆栈指针或上下文,效果相当于set pc = {int}location 4)中断 signal sig 立即将信号sig发给程序 5)其他
使用gdb调试内核 内核配置需要添加编译信息。 可以参考:https://blog.csdn.net/gatieme/article/details/104266966 在目标板上开启gdbserver模式(虚拟soc中加上gdb调试的选项);在host 上启动gdb客户端后连接虚拟soc提供的gdb服务(终端不会有输出),命令如下: # 启动gdb,工具链中gdb的路径,并读取符号表 # vmlinux相当于elf文件,具有符号表。 使用gdb扩展 内核通过python脚本定义了一组gdb命令,可方便其对内核的调试,如通过该脚本可以打印dmesg,percpu变量,通过pid打印其对应的task_struct结构体等。 在gdb中可以读取该文件。 # 启动gdb,工具链中gdb的路径,并读取符号表 # vmlinux相当于elf文件,具有符号表。Image文件相当于bin文件。
Breakpoint 4 at 0x709: file gdb_example.c, line 4. Breakpoint 5 at 0x709: file gdb_example.c, line 4. ) b 4 Breakpoint 1 at 0x714: file gdb_example.c, line 4. 举例 (gdb) set $i=0 (gdb) p $i $5 = 0 (gdb) 命令历史 可以把命令保存在文件中,保存命令历史后,就可以在其他调试会话中使用。 ) help li list machine instruction 还可以把各种设置写在文件中,运行调试器时读取这些文件。