1

这是我几周前加入 StackOverflow 以来的第一个问题,我希望有人能对这个让我发疯的问题有所了解!我已经在网上搜索过,但我找不到这个问题的成功解决方案。

我在使用 GNU GDB 在 Mac OSX 10.5.8 (Leopard) 上调试 Netbeans 7.1 时遇到了一些麻烦。我的问题是我不能轻易地从测试应用程序调试我自己的静态或动态库,因为调试器不会在该库的源代码中设置的断点处停止。但是我注意到我可以“进入”库函数,一旦我进入它们,这些函数中的断点就会触发!

我的测试平台包含 2 个简单的项目:“mylib”(一个 C 静态库)和“mylib-test”(一个 C 应用程序)。'mylib' 只包含定义函数的头文件和 ac 文件:

int sum(int a, int b) {
    return a+b;
}

另一方面,mylib-test 源代码只是使用该函数:

int main(int argc, char** argv) {
    printf("Result=%d\n", sum(111, 222));
    return (EXIT_SUCCESS);
}

两个项目都编译并成功执行。为方便起见,下面我记下编译/链接两个项目的输出:

编译 mylib 的输出

gcc    -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/m.o.d -o build/Debug/GNU-MacOSX/m.o m.c
mkdir -p dist/Debug/GNU-MacOSX
rm -f dist/Debug/GNU-MacOSX/libmylib.a
ar -rv dist/Debug/GNU-MacOSX/libmylib.a build/Debug/GNU-MacOSX/m.o 
ar: creating archive dist/Debug/GNU-MacOSX/libmylib.a
a - build/Debug/GNU-MacOSX/m.o
ranlib dist/Debug/GNU-MacOSX/libmylib.a

编译 mylib-test 的输出

gcc    -c -g -I../mylib -MMD -MP -MF build/Debug/GNU-MacOSX/main.o.d -o build/Debug/GNU-MacOSX/main.o main.c
mkdir -p dist/Debug/GNU-MacOSX
gcc     -o dist/Debug/GNU-MacOSX/mylib-test build/Debug/GNU-MacOSX/main.o ../mylib/dist/Debug/GNU-MacOSX/libmylib.a 

通过检查调试器控制台,我注意到当我在调试器上加载应用程序时,放置在库源代码中的断点被标记为“PENDING”(参见以12^done开头的行,字段addr):

11-break-insert -f "/Users/claudi/dev/mylib-test/main.c:16"
12-break-insert -f "/Users/claudi/dev/mylib/m.c:5"
7^done,line="7",file="main.c",fullname="/Users/claudi/dev/mylib-test/main.c",time={wallclock="0.00065",user="0.00032",system="0.00029",start="1345544547.505531",end="1345544547.506184"}
(gdb) 
13-break-insert -t main
&"cd /Users/claudi/dev/mylib-test\n"
8^done
(gdb)
9^done,time={wallclock="0.00002",user="0.00002",system="0.00000",start="1345544547.530991",end="1345544547.531013"}
(gdb) 
&"set environment DYLD_LIBRARY_PATH=../mylib/dist/Debug/GNU-MacOSX\n"
10^done
(gdb) 
11^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y",addr="0x00001fb3",func="main",file="main.c",line="16",shlib="/Users/claudi/dev/mylib-test/dist/Debug/GNU-MacOSX/mylib-test",times="0"},time={wallclock="0.00058",user="0.00030",system="0.00029",start="1345544547.532421",end="1345544547.533003"}
(gdb) 
12^done,bkpt={number="2",type="breakpoint",disp="keep",enabled="y",addr="<PENDING>",pending="/Users/claudi/dev/mylib/m.c:5",times="0"},time={wallclock="0.00040",user="0.00018",system="0.00022",start="1345544547.533140",end="1345544547.533542"}
(gdb) 
13^done,bkpt={number="3",type="breakpoint",disp="del",enabled="y",addr="0x00001fb3",func="main",file="main.c",line="16",shlib="/Users/claudi/dev/mylib-test/dist/Debug/GNU-MacOSX/mylib-test",times="0"},time={wallclock="0.00017",user="0.00016",system="0.00001",start="1345544547.552190",end="1345544547.552362"}

似乎 GDB 没有加载库的符号,但它实际上是静态链接的(我的意思是,没有要加载的动态库)!!但是,如果我sum从函数中进入函数main(),然后放置断点,则成功解决:

21-break-insert -f "/Users/claudi/dev/mylib/m.c:5"
21^done,bkpt={number="4",type="breakpoint",disp="keep",enabled="y",addr="0x00001fea",func="sum",file="m.c",line="5",shlib="/Users/claudi/dev/mylib-test/dist/Debug/GNU-MacOSX/mylib-test",times="0"},time={wallclock="0.00099",user="0.00039",system="0.00060",start="1345544947.877096",end="1345544947.878088"}

我希望我已经提供了足够的信息......有人知道发生了什么吗?先感谢您!

更多信息:

GCC 版本:686-apple-darwin9-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5577)

GDB 版本:GNU gdb 6.3.50-20050815(苹果版 gdb-967)

Netbeans 版本:7.1(内部版本 201112071828)

/////////////编辑////////////////////////////// ///////////////

到目前为止,我认为问题出在 GDB 上,但今天我注意到它不是真的:我已经能够从命令行直接使用 GDB 调试应用程序,即我可以为我的sum函数和调试器设置断点成功停在他们身上,而无需进入该功能。所以,我确定我在 NetBeans 如何启动/初始化 GDB 方面遇到了一些问题。我还注意到 NetBeans 试图从 GDB 获取功能但没有成功。从调试器控制台:

~"GNU gdb 6.3.50-20050815 (Apple version gdb-967) (Tue Jul 14 02:11:58 UTC 2009)\n"
~"Copyright 2004 Free Software Foundation, Inc.\n"
~"GDB is free software, covered by the GNU General Public License, and you are\nwelcome
to change it and/or distribute copies of it under certain conditions.\nType \"show 
copying\" to see the conditions.\nThere is absolutely no warranty for GDB.  Type \"show 
warranty\" for details.\n"
~"This GDB was configured as \"i386-apple-darwin\"."
~"\n"
(gdb) 
2-list-features
3-gdb-set print repeat 0
4-gdb-set backtrace limit 1024
5-gdb-set print elements 0
6-file-exec-and-symbols  "/Users/claudi/dev/mylib-test/dist/Debug/GNU-MacOSX/mylib-test"
2^error,msg="Undefined MI command: list-features"
4

2 回答 2

0

我对这个问题没有答案,但我有一些线索可以帮助找到解决方案。

我相信这不是 NetBeans 的错。这与gdb有关。可能它必须使用一些特殊的配置标志进行编译。

我在 Windows 7 上使用 gdb 7.4(之前使用 MinGW 下载)与 NetBeans 7.0-7.2 和 Eclipse Juno,一切都按预期工作 - 在我的库(静态或动态)中输入断点时 gdb 停止。

最近我想迁移到使用 Python 支持编译的 gdb,以便在 Eclipse 中漂亮地打印复杂的 STL 结构。因此,我下载了最新的 gdb 7.5 源代码,并使用“--with-python”标志对其进行了编译:

./configure --with-python
make && make install

漂亮的漂亮作品。甚至不是在 Eclipse 上,而是在 NetBeans 上(您只需要在项目的调试设置中指向 .gdbinit 文件)。问题是我自己编译的 gdb 版本无法在我的库中的断点处停止(在 NetBeans 7.2 和 Eclipse Juno 上)。

我的结论是 gdb 应该用一些标志来编译以获得这种能力。或者也许用一些标志来运行它就足够了。对于这个问题,我也将不胜感激。

我附上了一些可能有用的信息:

在 gdb 7.4 上具有正确堆栈跟踪的屏幕截图

gdb 7.5 上的堆栈跟踪不正确的屏幕截图

正确的 gdb:

C:\MinGW\bin>gdb  --version
GNU gdb (GDB) 7.4
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

C:\MinGW\bin>gdbserver --version
GNU gdbserver (GDB) 7.4
Copyright (C) 2012 Free Software Foundation, Inc.
gdbserver is free software, covered by the GNU General Public License.
This gdbserver was configured as "i686-pc-mingw32"

不正确的 gdb:

C:\MinGW\bin>gdb --version
GNU gdb (GDB) 7.5
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-mingw32".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.

C:\MinGW\bin>gdbserver --version
GNU gdbserver (GDB) 7.5
Copyright (C) 2012 Free Software Foundation, Inc.
gdbserver is free software, covered by the GNU General Public License.
This gdbserver was configured as "i686-pc-mingw32"
于 2012-08-21T21:58:52.577 回答
0

如果没有 libexpat 导致您描述的 gdb 问题,我已经检查过我的工作。似乎是这样:) 尝试先编译和安装 expat,然后从源代码编译 gdb。一定要有:

checking for libexpat... yes
checking how to link with libexpat... <some_path>/libexpat.a

在您的日志中(在“make”命令之后的某个位置。而不是在“./configure”之后)。

为了编译 gdb,我在 Windows 7 和 gdb-7.5 源中使用了 MinGW 的 gcc 4.6.2。我还添加了两个额外的配置标志,但可以肯定它们不是必需的:

./configure --with-python --without-auto-load-safe-path 
于 2012-08-23T09:07:40.983 回答