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



我得到了一个由c++和QT模块组成的巨大代码。要编译,我需要运行/配置,然后制作。

/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文件中)

如有任何提示,不胜感激。

GDB在运行程序之前不会从.so文件加载符号。此外,可以通过文件名引用文件,而不使用路径。

尝试

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

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

(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提出的问题回答yes,或者只运行一次应用程序(这将使GDB加载并保留该运行中使用的所有库的调试符号),然后为第二次运行设置断点。

然后我做了这个:

愤怒的活动不能代替理解。由于您缺乏理解,在GDB中键入各种"随机"命令不太可能对您有所帮助。

更新:

再次出现与"没有名为…的源文件"相同的错误

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

最新更新