Feeds:
文章
评论

Archive for 2012年1月

b foo

我想在foo函数(类ClassA的成员函数)上设置一个断点,执行

b foo

但是GDB报告说

Function “foo” not defined.

Make breakpoint pending on future shared library load? (y or [n])

问题是,foo函数并不是在一个shared library中定义的,而是在一个静态库中定义的,在可执行文件(假设叫proc)编译的时候,已经链接好了。

问题在于执行b命令的时候,需要指定foo函数的全名,即

namespace::class_name::function_name

当我意识到这个问题的时候,也犯了错误:没有意识到foo的全名前还有一个namespace。(因为是在改别人的代码)。在不确定的时候,总结正确的流程如下:

1. 确保在编译proc的时候,加上了-g参数,用于调试。

2. 用如下命令列出proc所具有的全部的符号

nm proc

3. 在proc所具有的全部的符号中,搜索foo,得到

_ZN3NamespaceA6ClassA16fooEP6ClassB
_ZN3NamespaceA6ClassA16fooEb

由于C++支持重载,我的proc中有两个foo函数,一个参数是ClassB的一个指针,一个参数是boolean型。上述符号来自对编译时C++函数的签名法则,不同编译器生成的结果可能不同。

这时候,可以确定完整的foo函数签名应该是

NamespaceA::ClassA::foo

执行

b NamespaceA::ClassA::foo

GDB会同时在上述两个函数设置断点,并给出如下提示

Breakpoint 1 at 0x82223aa: file /home/userA/project/foo/foo.cpp, line 280.
Breakpoint 2 at 0x8222b96: file /home/userA/project/foo/foo.cpp, line 351.
warning: Multiple breakpoints were set.
Use the "delete" command to delete unwanted breakpoints.

 

Read Full Post »