gdbDebug

DEBUG

GDB

基本调试命令

命令 命令缩写 命令说明 列子
set args 设置启动传递的参数 (gdb)set args 112 给程序传一个int 112整数
break b 设置断点 (gdb)b 123
bt 显示栈
i 查看信息 (gdb)i b 查看所有断点
run r 开始运行程序,程序远行到断点的位置停下,如果没有断点程序直接运行下去。
next n 执行当前行语名,如果该语句为函数调用,不会进入函数内部执行。
step s 执行当前行语名,如果该语句为函数调用,则进入函数内部执行其中第一条语句。如果是库必须要有源码才能进入。
finish 退出当前调试的文件返回到上一个断点 (gdb)finish
print p 显示变量值 (gdb)p name表示显示变量name。
contiune c 继续程序的运行,直到遇到下一个断点停止。
dir 临时添加源文件位置 (gdb)dir /home/xxx
set var name=val 设置变量的值. 假设程序有两个变量:int i;char name[20];set var i=10,把i的值设置为10;set var name="hello",把name的值设计为"hello",注意:不是strcp
quit q 退出gdb调试环境

tui模式

使用gdb的tui可以显示源码调试功能。进入tui模式快捷键ctr+x+a,也可以在启动gdb时加入参数进行启动

gdb ./app -tui
#或者使用
gdbtui -q ./app
  1. 进入tui模式后相关快捷键功能:

    • ctrl+L : 刷新窗口
    • ctrl+x : 再按1,单窗口模式,只显示一个窗口。
    • ctrl+x : 再按2,双窗口模式,只显示两个窗口。
    • ctrl+x : 再按a,回到传统模式,退出tui返回调度窗口。
  2. 默认情况下,gdb tui模式显示command窗口和source窗口,还有四个常用窗口如下:

    • (cmd)command命令窗口,可以输入调度命令
    • (src)source源码窗口,显示当前行,断点等信息。
    • (asm)assembly汇编代码窗口
    • (reg)register寄存器窗口

    可以通过“layout+窗口类型”命令来选择自己需要的窗口,例如在cmd窗口输入layout asm则可以切换到汇编代码窗口。
    layout命令还可以用来修改窗口布局,输入help layout常见有:

    Usage: layout prev | next | <layout_name> 
    Layout names are:
        src   : Displays source and command windows.
        asm   : Displays disassembly and command windows.
        split : Displays source, disassembly and command windows.
        regs  : Displays register window. If existing layout
                is source/command or assembly/command, the 
                register window is displayed. If the
                source/assembly/command (split) is displayed, 
                the register window is displayed with 
                the window that has current logical focus.
    
  3. 另外,可以通过winheight命令修改各个窗口大小如下:

(gdb) help winheight
Set the height of a specified window.
Usage: winheight <win_name> [+ | -] <#lines>
Window names are:
src  : the source window
cmd  : the command window
asm  : the disassembly window
regs : the register display
 
##将代码窗口的高度扩大 5 行代码
winheight src + 5
##将代码窗口的高度减小 4 代码
winheight src - 4

当前 GDB TUI 窗口放大或者缩小以后,窗口中的内容不会自己刷新以适应新的窗口尺寸,我们可以通过 space 键强行刷新 GDB TUI 窗口。

  1. 窗口焦点切换
    在默认设置下,方向键和 PageUp/PageDown 都是用来控制 GDB TUI 的 src 窗口的,因此,我们常用上下键显示前一条命令和后一条命令的功能就没有了,不过可以通过 Ctrl + N/Ctrl + P 来获取这个功能。

注意:通过方向键调整了GDB TUI 的 src 窗口以后,可以用 update 命令重新把焦点定位到当前执行的代码上。

我们可以通过 focus 命令来调整焦点位置,默认情况下焦点是在 src 窗口,通过 focus next 命令可以把焦点移到 cmd 窗口,这时候就可以像以前一样,通过方向键来切换上一条命令和下一条命令。同理,也可以使用 focus prev 切回到源码窗口,如果焦点不在 src 窗口,我们就不必使用方向键来浏览源码了。

(gdb) help focus  
help focus
Set focus to named window or next/prev window.
Usage: focus {<win> | next | prev}
Valid Window names are:
src  : the source window
asm  : the disassembly window
regs : the register display
cmd  : the command window

设置源码路径

  • 当我们在设备上使用源码编译程序后,在另一台设备上应用并gdb调试时,这时会提示找不到源码文件。

  • 这是因为在另一台设备中没有源码文件,即使有源码文件,如果路径和在编译时的路径一致的情况下也是不行的。

  • 此时我们只需将源码拷贝到另一台设备中,然后在gdb模式中设置新的路径:(gdb) set substitute-path 编译路径 新路径, 查看源码路径(gdb) show substitute-path。

  • 如果不知道编译路径可以使用:(gdb) dir ./main查看路径。

    (gdb) set substitute-path 编译路径 新路径
    (gdb) show substitute-path 查看源码路径(gdb)

调试的编译设置

  1. cmake
    必须打开调试模式,并设置相关参数。

    set(CMAKE_BUILD_TYPE "debug")
    set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")

  2. makefile

    gcc 命令编译需要添加-g参数。

  3. meson build

调试core文件

gdb a.out core

想要产生core文件,需要设置环境.bashrc文件添加如下:

ulimit -c unlimited
alias gdb="gdb -q"  #此行是别名,可以不加

例子

  1. 设有以下代码,当编译时不会报错
//a.c
int main()
{
    int *temp=NULL;
    
    *temp=10;
    return 0
}
  1. 以上代码编译完成后运行设名a.out
    得到一个断错误,并在执行程序目录下生成core文件或core.xxxxxx(进程id)
  2. 此时可以使用gdb带core文件进行错误定位
gdb a.out core

调试正在运行的程序

ps -ef | grep a.out     #假设此得到的进程id为1234

gdb a.out 1234    #1234以上进程id
#或者
gdb a.out -p 1234

多线程调试

CGDB

上神器cgdb:https://blog.csdn.net/xp178171640/article/details/123779457

posted @   alvinlyb  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示