这是我几周前加入 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"