gdb项目(多文件)代码调试

针对项目代码,多文件下的gdb调试。

  1. CMakeLists.txt编写
    保证G++ flag 要有"-g",下为CMakeLists.txt的C++ flags设置
ste(CMAKE_CXX_FLAGS_DEBUG "$EVN{CXXFLAGES} -o0 -g -ggdb")
  1. gdb使用

2.1. 对于执行文件和源文件不在同一目录下。先进入可执行文件目录,然后使用gdb命令

# cd ../build/bin
# gdb test

2.2. 对源程序打断点

# b test1.cpp:LineNum  or break test1.cpp:LineNum
  • gcc在编译生成一个可执行文件的时候,它并没有记录各个文件的路径名,但是gcc有保存各个文件的文件名,各个函数的函数名。因此可以直接补全文件名和函数名,不需要输入文件的路径。
  • 先说文件名或函数名在全局中没有重名的情况。函数名全局唯一,如果要在某个文件的某个函数设断点,就可以直接用break func_name来实现,这时跟函数所在的多层目录没有关系。
  • 但如果这个函数在多个文件中都有调用或者不同文件中的相同函数名,则只能在其中一个设断点,解决的办法是用break file.c:func_name或者break file.c:linenum来解决,此时也不必指出文件所在的多层目录,因为gdb会把你的路径信息全当成文件名来解释,何况gdb中也不保存路径信息。
  • 同时最棘手的问题出现了:函数名在全局不是唯一的(这样就不能直接用break func_name设断点了),同时文件名也不是唯一的(这样就不能用后一种方法设断点了),比如我编译的是当前目录下的main.c, ./test/env.c, ./t2/env.c其中后两个文件中都调用了相同名的函数hello,那我用命令break env.c:hello的时候,gdb只会在./t2/env.c中的hello设置断点,而不能在./test/env.c中的hello设置断点。

于是我用了最笨的办法,先用disassemble找出./t2/env.c中hello的地址,然后直接用命令break *address来设置断点。或者用单步执行到那里,用命令:info register查看当前的寄存器eip的值也就是下一指令地址值,然后再用break *address来设置断点。

2.3. 启动可执行程序

# r test   or run test

2.4. 打印断点处信息

# p b  or prntf break
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值