如何使用gdb调试带有递归makefile的代码库

时间:2014-04-09 02:21:17

标签: c++ makefile gdb gnu-make

我获得了一个由c ++和QT模块组成的庞大代码。要编译,我需要运行./configure然后make。

./ configure在目录和子目录中生成多个makefile,并在目录中运行make递归运行make。

现在我想在test.h中更改一小部分代码。 可执行文件位于不同的文件夹中。

这是问题所在;

# gdb foo
Reading symbols from /xx/yy/zz/foo

(gdb) break ../qq/zz/test.h:53
No source file named ../qq/zz/test.h
Make breakpoint pending on future shared library load? (y or [n])

我也尝试过绝对路径,但也没有。

然后我这样做了:

(gdb) add-symbol-file  ../qq/zz/someObjFile.o
The address where ../qq/zz/someObjFile.o has been loaded is missing

然后我尝试了这个:

(gdb) symbol-file ../qq/zz/someObjFile.o
Load new symbol table from "../qq/zz/someObjFile.o"? (y or n) y
Reading symbols from  "../qq/zz/someObjFile.o" ...done
(gdb) break test.h:53
Cannot access memory at address 0x20

我看到一些线程正在回答"无法访问地址"通过查找实际的内存地址,但我认为这不是我需要的。我错过了一些简单的东西。

如果有帮助:

我使用GNU gdb(Ubuntu / Linaro 7.4-2012.04-0ubuntu2.1)和someObjFile.o是makefile在test.h存在的文件夹中生成的目标文件(test.h包含在someObjFile中) .cpp文件)

任何提示都表示赞赏。

2 个答案:

答案 0 :(得分:2)

在运行程序之前,GDB不会从.so文件加载符号。此外,文件通常由文件名引用,没有路径。

尝试

b main
r
...
...
# GDB stops
b test.h:57

此外,有时在大型项目中,GDB对行号感到困惑。尝试在函数上设置断点。

答案 1 :(得分:1)

(gdb) break ../qq/zz/test.h:53
No source file named ../qq/zz/test.h
Make breakpoint pending on future shared library load? (y or [n])

这个通常是意味着有问题的代码已构建到共享库中,并且加载了共享库尚未。< / p>

您应该回答yes对GDB提出的问题,或者只运行一次应用程序(这将使GDB加载并保留该运行中使用的所有库的调试符号),然后 < / em>为第二次运行设置一个breakpoing。

  

然后我这样做了:

激烈的活动不能代替理解。由于您缺乏理解,因此在GDB中输入各种“随机”命令不太可能对您有所帮助。

更新

  

再次出现与“No source file named ...”

相同的错误

嗯,someObjFile.o中的代码实际上并未加载到您的进程中。确认这一点的一种简单方法是将assert(0)放在test.h的第53行。如果您的程序仍然运行,那么(假设您在构建时不使用-DNDEBUG),您可以确定第53行实际上从未执行过。