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

Android 在Eclipse中查看变量时gdb进程崩溃,android,c++,eclipse,android-ndk,gdb,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 Dir

简而言之,我正在使用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
每次我在这个特定断点上停止并打开变量视图时,就会发生崩溃(只要我不查看变量,它就不会崩溃)

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

windows任务管理器附带的android-ndk-r9d\toolchains\arm-linux-AndroidAbi-4.6\Prebuild\windows\bin\arm-linux-AndroidAbi-gdb-orig.exe转储文件:

正在调试的源文件


如果需要更多的上下文,下面是完整的故事。我正在尝试在Windows中设置一个新的NDK项目。到目前为止,我已经能够使用英伟达调试管理器插件来调试Eclipse。然而,几乎在我让它工作之后,我立即遇到了变量视图的问题,导致gdb崩溃。我没有任何使用gdb命令行的经验,插件也不允许我输入自己的命令。我不能绕过插件直接使用调试器,因为插件处理连接到设备上的gdbserver和解析调试符号的复杂部分(我已经能够在没有插件的情况下连接到gdbserver,但我无法使调试符号在我的代码使用的静态库中工作)

以下是我学到的:

  • gdb崩溃的原因是我将过时的-gstab+标志传递给了g++(-gstab导致了相同的问题)
  • 没有-GSTAB +或-GSTAB,调试器(包括Eclipse前端)工作,但不显示本地变量(例如C++)“/LI>”
  • 调试器不显示局部变量的原因在于NDKR9D工具链使用GDB7.3和g++4.8,这两种工具不兼容(是的,这是一个巨大的WTF时刻)。也就是说,默认情况下,g++4.8以dwarf-4格式生成调试信息,而gdb 7.3仅支持dwarf版本2之前的版本
  • 第(3)种解决方法是将-gdwarf-2传递给编译器
  • 但(3)还有一个终极解决方案——用更新的版本(7.6)替换gdb,该版本可以从Linaro工具链版本中提取:

  • 最好的选择可能是构建gdb的调试版本并查看回溯
    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