在Eclipse中查看变量时,gdb进程崩溃

时间:2014-05-17 23:23:00

标签: android c++ eclipse android-ndk gdb

简而言之,我使用Eclipse插件作为gdb的前端,并试图找出gdb崩溃的原因。完整的gdb日志很长,但相关部分在这里:

(gdb)
915 whatis this
&"whatis this\n"
~"type = Director * const\n"
915^done,time={wallclock="0.01200",user="0.01200",system="0.00000"}
(gdb)
916 ptype Director * const
&"ptype Director * const\n"
&"A syntax error in expression, near `const'.\n"
916^error,msg="A syntax error in expression, near `const'."
(gdb)
917 ptype this
&"ptype this\n"
~"type = struct Director : public Ref {\n"
~" public:\n"
~" static const char *EVENT_PROJECTION_CHANGED;\n"
~" static const char *EVENT_AFTER_UPDATE;\n"
~" static const char *EVENT_AFTER_VISIT;\n"
~" static const char *EVENT_AFTER_DRAW;\n"
~" protected:\n"
~" bool _purgeDirectorInNextLoop;\n"
~" struct Scheduler *_scheduler;\n"
~" struct ActionManager *_actionManager;\n"
918 whatis prevCalls
919 whatis prevVerts
920-var-create - * this
921-var-create - * prevCalls
922-var-create - * prevVerts
923-gdb-exit

每次我停在这个特定的断点并打开变量视图时就会发生崩溃(只要我没有查看变量,它就不会崩溃)。

Problem signature:
Problem Event Name: APPCRASH
Application Name:   arm-eabi-gdb.exe
Application Version:    0.0.0.0
Application Timestamp:  50ee5128
Fault Module Name:  arm-eabi-gdb.exe
Fault Module Version:   0.0.0.0
Fault Module Timestamp: 50ee5128
Exception Code: c0000005
Exception Offset:   000dacc4
OS Version: 6.1.7601.2.1.0.256.1
Locale ID:  1033
Additional Information 1:   0a9e
Additional Information 2:   0a9e372d3b4ad19135b953a78882e789
Additional Information 3:   0a9e
Additional Information 4:   0a9e372d3b4ad19135b953a78882e789

gdb可执行文件是插件附带的(eclipse / plugins / com.nvidia.ndklaunch_21.0.0.201307250029 / gdb / windows / arm-eabi-gdb.exe)。我还尝试了两个来自NDK工具链(4.6和4.8)的gdb版本,结果相同。

使用Windows任务管理器获取的android-ndk-r9d \ toolchains \ arm-linux-androideabi-4.6 \ prebuilt \ windows \ bin \ arm-linux-androideabi-gdb-orig.exe的转储文件:{{3 }}

正在调试的源文件https://docs.google.com/file/d/0B6bp7nCoOK_peTNIMDVpN0QtTjA/

如果需要更多背景,这里是完整的故事。我正在尝试在Windows中设置一个新的NDK项目。到目前为止,我能够使用Eclipse的NVidia Debug Manager插件达到调试器类型的作用。然而,几乎在我开始工作之后,我遇到了变量视图导致gdb崩溃的问题。我对gdb命令行没有任何经验,插件也不允许我输入自己的命令。我无法绕过插件并直接使用调试器,因为插件处理连接到设备上的gdbserver并解析调试符号的复杂部分(我已经能够连接到没有插件的gdbserver,但我无法制作调试符号适用于我的代码正在使用的静态库)。

1 个答案:

答案 0 :(得分:2)

这是我学到的:

  1. gdb崩溃的原因是我将过时的-gstab +标志传递给g ++(-gstab导致同样的问题)
  2. 没有-gstab +或-gstab,调试器(包括Eclipse前端)可以工作,但不显示局部变量(例如C ++“this”)
  3. 调试器没有显示局部变量的原因在于NDK r9d工具链使用的gdb 7.3和g ++ 4.8是不兼容的(是的,一个巨大的WTF时刻)。也就是说,默认情况下,g ++ 4.8以dwarf-4格式生成调试信息,而gdb 7.3仅支持dwarf到版本2.
  4. (3)的解决方法是将-gdwarf-2传递给编译器
  5. 但也有(3)的最终解决方案 - 用更新的版本(7.6)替换gdb,可以从Linaro工具链版本中提取:https://releases.linaro.org/13.10/components/toolchain/binaries/gcc-linaro-arm-linux-gnueabihf-4.8-2013.10_win32.zip