gdb加载动态库成功,但是不能显示动态库中的源码(gdb+gdbserver)

模拟器上先运行gdbserser

(cygwin 命令行运行)
/cygdrive/x/eclipse3.7.1/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-gdb.exe host --dir=X:\\2786\\Platform\\Elastos --dir=Z:\\

(gdb)set solib-search-path X:\2786\Targets\pdk\linux\arm.gnu_gcc4.ElastosOS.dbg\dbg_info
(gdb)set solib-search-path X:\2786\lib

(gdb)target remote :1234

(gdb) b 72 (这就是host程序的文件)
Breakpoint 1 at 0x8894: file X:/2786/Platform/Elastos/Framework/host/linux/main.
cpp, line 72.

(gdb) c
Continuing.
[New Thread 238]
[Switching to Thread 238]

Breakpoint 1, main (argc=3, argv=0xbea11d54)
at X:/2786/Platform/Elastos/Framework/host/linux/main.cpp:74
74 String(klassName), (IClassInfo**)&classInfo);
Current language: auto; currently c++

(gdb) l
69 printf("Acquire enum item\"ApartmentAttr_Current\" failed!\n");
70 return 1;
71 }
72
73 ec = moduleInfo->GetClassInfo(
74 String(klassName), (IClassInfo**)&classInfo);
75 if (FAILED(ec)) {
76 printf("Acquire \"%s\" class info failed!\n", klassName);
77 return 1;
78 }

(gdb) shared
……
Reading symbols from X:\2786\Targets\pdk\linux\arm.gnu_gcc4.ElastosOS.dbg\dbg_info/Elastos.Framework.so...done.
……

(gdb) b CApartment.cpp:55
Breakpoint 2 at 0x805df2f8: file X:/2786/Platform/Elastos/Framework/eco/Win32/ut
ils/CApartment.cpp, line 55.
(这个文件是Elastos.Framework.so中的一个文件,从打印信息来看,gdb知道文件路径)

(gdb) c
Continuing.

Breakpoint 2, 0x805df2f8 in ?? ()
from X:\2786\Targets\pdk\linux\arm.gnu_gcc4.ElastosOS.dbg\dbg_info/Elastos.Fr
amework.eco
(这里应该出问题了,虽然知道是Elastos.Framework.so中的但是不知道是哪个文件,之后的调试当然就继续看不到代码了,再继续就错误了。但是这个断点是中了,也中对地方了,就是在在那个文件不知道,当然list也打不出东西来)

(gdb) info shared
0x80435990 0x8062fdf4 Yes X:\2786\Targets\pdk\linux\arm.gnu_gcc4.Elast
osOS.dbg\dbg_info/Elastos.Framework.so

用si还是可以运行的,从打印的地址来看似乎是在一条一条指令的执行
(gdb) si
0x805df2fc in ?? ()
from X:\2786\Targets\pdk\linux\arm.gnu_gcc4.ElastosOS.dbg\dbg_info/Elastos.Fr
amework.so
(gdb)
0x80435428 in ?? ()
from X:\2786\Targets\pdk\linux\arm.gnu_gcc4.ElastosOS.dbg\dbg_info/Elastos.Fr
amework.so
(gdb)
0x8043542c in ?? ()
from X:\2786\Targets\pdk\linux\arm.gnu_gcc4.ElastosOS.dbg\dbg_info/Elastos.Fr
amework.so
(gdb)
0x80435430 in ?? ()
from X:\2786\Targets\pdk\linux\arm.gnu_gcc4.ElastosOS.dbg\dbg_info/Elastos.Fr
amework.so

请高手指点下把。

第1个回答  2012-02-11
因为具体的给的不够详细,不清楚你遇到的情况。
如果仅从断点上看,应该就是CApartment.cpp:55
但是,如果你的程序编译的时候,不是-O0,那个可能回不到源码,只能看汇编。
1、有时候(很少)就是编译器的错误。
2、还有可能就是你调试的程序和你的源码不匹配
3、你的程序已经崩溃了,破坏了堆栈或者GDB需要的数据。
4、这个地方有特殊的定位信息
5、其他情况,还是比较多的,经常遇到。
如果懂汇编,最好看看汇编。
如果不懂,看看那一条语句是最后一条能够跟踪的语句。
仔细看看最后一条语句的所有变量,应该能猜出来是什么问题。追问

会不会是我们公司编译器的问题。公司的编译器在编译源代码的时候会在某个规则生成的镜像目录下生成一些cpp文件,这些文件有些是通过perl脚本之类的生成的。然后在编译这些cpp文件。最终生成so。

追答

如果是cpp编译的不会有问题,只要原始的cpp文件能找到就没问题,如果临时生成的cpp可能有些麻烦。那些文件可能在你调试时已经删除,所以GDB找不到源代码。
但是大的项目,二次甚至多次编译的很常见,这些调试都需要很多人制定规则。具体的在这里说不明白。反正我觉得原理上没有问题,但是细节上你也说不清楚。不会看汇编,很难搞清底层。
要想找编译的问题,必须看汇编。这样才能知道编译器的意图,从而确定是人的错误还是编译器的错误。
比如这里面所说的eco文件是不是一个你们二次编译的文件,有可能源代码在那个文件中。
X:\2786\Targets\pdk\linux\arm.gnu_gcc4.ElastosOS.dbg\dbg_info/Elastos.Framework.eco
举个例子,你如果CPP里面include了一个头文件,头文件里面有可以执行的东西,而那个东西报错,最后头文件删除了,就不可能找到源代码了。再说下去,你去找顾问好了。