我获得了一个由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文件)
任何提示都表示赞赏。
答案 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行实际上从未执行过。