gdb调试

  1. 编译器
  2. gdb调试
    1. 启动
    2. 查看源代码
    3. 设置断点
    4. 运行程序
    5. 监视变量
    6. 临时改变变量
    7. 查看堆栈
    8. gdb 调试python程序
  3. ROS中使用
  4. rosrun启动gdb
  5. 引用

编译器

gcc(GNU Compiler Collection)

-c  激活预处理、编译和汇编,生成.o文件
-S  激活预处理和编译,生成.s的汇编代码wenjain
-E  激活预处理,结果输出到标准输出(屏幕),可结合重定向输出到文件 > pre_test
-g  为调试程序生成相关信息

默认生成a.out文件,可以使用-o 指定输出文件

编译c++:g++ gcc可以编译c++源文件,但是不会自动和c++程序使用的库连接,所以通常使用g++,会自动调用gcc

gdb调试

很多命令可以缩写为一个字母

启动

gcc -g summary.c
gdb a.out    #二进制文件作为gdb参数就可以了,可以是最后生成的可执行文件

查看源代码

l       #list
search  #reverse-search
回车      #重复上一指令

设置断点

b 10  #第10行设置断点
info break   #查看断点信息
clear       #清除当前行断点

运行程序

r
n   #单步执行程序
continue    #运行到下一个断点
s   #step  遇到函数调用会进入函数内部 next不会

监视变量

print variable  #缩写p  
watch varialbe    #监视

临时改变变量

set var i=1 #临时设置i=1

查看堆栈

bt  #程序调用函数,函数的地址、参数、函数内局部变量都会压入

gdb 调试python程序

gdb python
run xxx.py    

ROS中使用

launch文件

launch-prefix="xterm -e gdb --args"     //in a separate xterm window
launch-prefix="gdb -ex run --args"    //in the same xterm

使用memcheck启动valgrind来检测程序内存泄露 使用callgrind执行性能分析

launch-prefix="valgrind"    //valgrind

设置ROS节点core文件转储  coredump 进程突然崩溃的那一刻的内存快照

ulimit -c unlimited
echo 1 > /proc/sys/kernel/core_uses_pid     #将core文件名设置成默认使用进程的pid

gdb  program_name  core_name  #查看core文件 program为编译好的  /var/core_log

rosrun启动gdb

rosrun --prefix 'gdb -ex run --args' [package_name] [node_name]     

引用

  1. ros Tutorial Roslaunch Nodes in Valgrind or GDB

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 yangbenbo@whu.edu.cn

文章标题:gdb调试

本文作者:杨本泊

发布时间:2019-10-03, 09:09:21

最后更新:2023-07-09, 07:10:11

原始链接:http://yangbenbo.github.io/2019/10/03/gdb调试/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录