首页 > 编程知识 正文

gdb使用方法,gdb调试教程

时间:2023-05-03 22:25:19 阅读:46630 作者:1590

ROS软件框架附带了很多调试手段。 使用GDB调试ROS节点,输出调试信息,并使用rxgraph图形监视节点的状态。 本文介绍第一种方法GDB调试。一,设置ROS节点core文件转储功能

)1)设置核心文件大小限制

ulimit -aulimit -c #表示核心文件的大小限制,0表示不生成核心文件,unlimited表示无限制的ulimit -c unlimited #不设置核心文件的大小限制

默认生成路径:输入与可执行文件的执行命令相同的路径

默认生成名称:默认名称为core。 新的核心文件将复盖旧的核心文件

a .将pid设置为文件扩展名

1 )添加pid作为扩展名,将生成的core文件名称为core.pid

0 :不将PID作为扩展名添加,将生成的核心文件名称为核心

将/proc/sys/kernel/core_uses_pid文件的内容更改为: 1

echo '1'/proc/sys/kernel/core _ uses _ PID #文件命令更改echo '文件路径- % e-% p-% t '/proc/sys/kernel /

可以在/corefile目录中批量生成core文件。 生成的文件名为core-命令名称-pid-时间戳

以下是参数列表:

%p - insert pid into filename添加进程id (PID )

% u-insertcurrentuidintofilename将添加当前uid (用户id )

% g-insertcurrentgidintofilename将添加当前的GID (用户组id )

% s-insertsignalthatcausedthecoredumpintothefilename添加导致核心的信号

% t-insertunixtimethatthecoredumpoccurredintofilename生成附加核心文件时的UNIX时间

添加% h-inserthostnamewherethecoredumphappenedintofilename主机名

% e-insertcoredumpingexecutablenameintofilename添加导致生成core的命令名称

)3)调试酷睿文件

gdb~~/temp/test./core-test-24641-1610611292 #此路径必须正确无误,为http://www.Sina.com/http://www.Sina.com /

GDB是由GNU开源组织发布的功能强大的程序调试工具,基于UNIX/LINUX操作系统下的命令行。 对于在Linux上工作的c程序员来说,gdb是不可缺少的工具

这个文件路径最好设置为主文件路径下,不然需要root权限才能写入

调试C/C程序需要在编译之前添加-g选项:

g -g hello.cpp -o hello调试可执行文件:

$gdb program program (即您的可执行文件)通常位于当前目录下。

core文件调试(core是在程序非法运行后进行core dump后生成的文件) :

$ gdbprogramcoredumpfile $ gdbprogramcore.11127调试服务程序:

$ gdbprogrampid $ gdb hello 1127http://www.Sina.com /

启动gdb后,进入交互模式,通过以下命令完成程序调试的注意高频使用的命令通常有缩写,熟练使用这些缩写命令可以提高调试效率

二,GDB调试

run :缩写为r。 它旨在运行程序,遇到断点时,程序将在断点处停止运行,并等待用户输入以下命令: continue(c (简称c ) )继续运行到下一个断点(或运行结束) next ) ),单步跟踪程序,以免遇到函数调用也进入此函数主体; 此命令与step的主要区别在于step

当用户遇到自定义函数时,他将步进到函数中执行,但next将直接调用函数,而不会进入函数中。 省略step(s ) )有单步调试函数调用时进入函数; 与指令n不同,n是不进入调用函数的until。 当tmdhn厌倦了在循环中单步跟踪时,它可以运行程序直到它退出循环。 until行号:运行到某一行。 不仅仅是为了摆脱循环finish。 运行程序直到当前函数返回完毕,打印函数返回时的堆栈地址、返回值和参数

数值等信息。call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55)quit:简记为 q ,退出gdb

设置断点

break n (简写b n):在第n行处设置断点 (可以带上代码路径和代码名称: b OAGUPDATE.cpp:578)b fn1 if a>b:条件断点设置break func(break缩写为b):在函数func()的入口处设置断点,如:break cb_buttondelete 断点号n:删除第n个断点disable 断点号n:暂停第n个断点enable 断点号n:开启第n个断点clear 行号n:清除第n行的断点info b (info breakpoints) :显示当前程序的断点设置情况delete breakpoints:清除所有断点:

查看源代码

list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12list 函数名:将显示“函数名”所在函数的源代码,如:list mainlist :不带参数,将接着上一次 list 命令的,输出下边的内容。

打印表达式

print 表达式:简记为 p
,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。print a:将显示整数 a 的值print ++a:将把 a 中的值加1,并显示出来print name:将显示字符串 name 的值print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数display
表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如:
display awatch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch awhatis :查询变量或函数info function: 查询函数扩展info locals: 显示当前堆栈页的所有变量

查询运行信息

where/bt :当前运行的堆栈列表;bt backtrace 显示当前调用堆栈up/down 改变堆栈显示的深度set args 参数:指定运行时的参数show args:查看设置好的参数info program: 来查看程序的是否在运行,进程号,被暂停的原因。

分割窗口

layout:用于分割窗口,可以一边查看代码,一边测试:layout src:显示源代码窗口layout asm:显示反汇编窗口layout regs:显示源代码/反汇编和CPU寄存器窗口layout split:显示源代码和反汇编窗口Ctrl + L:刷新窗口

注解
交互模式下直接回车的作用是重复上一指令,对于单步调试非常方便;

更强大的工具cgdb
cgdb可以看作gdb的界面增强版,用来替代gdb的 gdb -tui。cgdb主要功能是在调试时进行代码的同步显示,这无疑增加了调试的方便性,提高了调试效率。界面类似vi,符合unix/linux下开发人员习惯;如果熟悉gdb和vi,几乎可以立即使用cgdb。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。