android ndk的ndk-gdb与emacs的集成?

时间:2011-02-11 14:20:59

标签: android emacs gdb android-ndk

有人能告诉我如何使用 gdb-mode 从emacs中运行 ndk-gdb 吗?我目前正在 shell 缓冲区中运行它。我喜欢的是一种在我中断或步骤时自动将源文件缓冲区与gdb中的当前pc同步的方法。还有更多,比如从源代码设置中断,显示gdb本地等的缓冲区,以及gdb命令的关键快捷方式都会很重要。

背景:我正在开发使用android-模式的OSX 10.6.6上的2010-12-15的GNU Emacs 23.1.90.1(i386-apple-darwin10.5.0,NS apple-appkit-1038.35) ndk-r5b和android目标的混合java / c / c ++代码。

在emacs中的Android模式和shell(运行ndk-gdb)允许我查看我需要的所有内容,但是如果我可以获得与调试器同步的源缓冲区,或者获得相同的内容,我的设置会更方便EmacsWiki here中描述的内容。

仅供参考,我目前正在使用eclipse进行java端调试和开发,但发现它不稳定且难以设置本机工作,尽管有sequoyah的可用性,此外,eclipse不是emacs。 / p>

[追加]

使用ndk-gdb作为gdb命令运行M-x gdb(见下文)会产生一个名为 gud 的缓冲区,其模式行说“(Debugger:run [initializing ...])”。缓冲区不接受gdb命令,也不接受emacs gdb命令 - (M-s,M-n等导致<>

输出:

Current directory is /Users/jpschelter/
Android NDK installation path: /Developer/android-ndk-r5b
Using specific adb command: /Developer/android-sdk-mac_x86/platform-tools/adb
...
... ...
...
(no debugging symbols found)
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0xafd0e21c in nanosleep () from /Developer/Projects/ECS/DIGG/Projects/droid/obj/local/armeabi/libc.so
(gdb) Undefined command: "1-inferior-tty-set".  Try "help".
(gdb) Undefined command: "2-gdb-set".  Try "help".
(gdb) Undefined command: "3-gdb-set".  Try "help".
(gdb) Undefined command: "4-file-list-exec-source-files".  Try "help".
(gdb) Undefined command: "5-file-list-exec-source-file".  Try "help".
(gdb) Undefined command: "6-gdb-show".  Try "help".
(gdb) Undefined command: "7-stack-info-frame".  Try "help".
(gdb) Undefined command: "8-thread-info".  Try "help".
(gdb) Undefined command: "9-break-list".  Try "help".

还会创建名为*threads of**input/output of**breakpoints of*的缓冲区,但这些缓冲区都是空的。

浏览我的emacs的gdb-mi.el源代码,并与 gdb-debug-log 输出进行比较,看起来gdb-mi正在尝试将这些参数发送到gdb可执行文件,但gdb-server没有按预期响应命令?

请注意,使用ndk-gdb的命令行运行Mx gud-gdb似乎相当于在shell中运行ndk-gdb,因此问题似乎在emacs中的gdb-mode配置中。

2 个答案:

答案 0 :(得分:4)

我在emacs下运行gdb时遇到了完全相同的问题:* gud *窗口没有响应命令。但是,ndk-gdb在shell中运行良好。为了使它在emacs gud UI下工作,我不得不稍微修改一下ndk-gdb脚本。

在致电GDB(最后一行)时,请执行以下操作:

$GDBCLIENT --annotate=3 -x `native_path $GDBSETUP`

对于emacs gud界面,--annotate = 3选项是强制性的,没有它就无法工作(这就是为什么* gud *没有响应)。

但是你已经走了一半。现在它可以工作,但前提是你在项目根目录下的文件缓冲区中调用ndk-gdb(如AndroidManifest.xml)。由于你是一名C / C ++程序员并且你正在处理的资源是在jni目录下或更深层次,因此这在大多数情况下是不太可能的,你需要做更多的事情。 ndk-gdb脚本有点儿麻烦,很高兴你会对这个问题感到困惑(而gdb本身也无济于事。)

在脚本中搜索“PROJECT = $ OPTION_PROJECT”。你将在一个很长的if ... else ... fi子句中负责找到项目的根目录(如果没有给出--project选项,虽然这样做不会解决问题我谈谈,见下文)。在fi之后,添加以下行:

cd $PROJECT

由于某些不明原因,脚本不会cd到项目根目录。当处理脚本假定在项目根目录的gdb.setup文件时,这会导致非常错误的行为。添加此行将解决此问题。

确保使用常用命令在emacs中调用ndk-gdb:

(gdb "ndk-gdb ...")

不要使用gud-gdb(奇怪的是,这是旧的emacs使用gdb的方式,与您正在搜索的优秀UI无关)。用你的论点替换......(concat ......)或任何你想要的东西。我强烈建议使用--project选项。如果不这样做,并且您处于项目之外的文件的缓冲区中,则脚本将找不到根目录。更糟糕的是,如果你在另一个Android项目的文件中,它会找到该项目的根目录(甚至可能在gdb会话失败之前将gdb.setup和stuffs复制到其中)。所以给那个该死的 - 项目选项。如果您使用的是emacs桌面命令集,请执行以下操作:

(gdb (concat "ndk-gdb --project=" desktop-dirname ...))

(假设你的.emacs.desktop当然是项目的根源。)

现在,您最终可以使用gud UI进行调试,在源级别设置断点。 请注意,我使用的是emacs 23.3.1(gdb-ui.el),因此无需使用24即可。

答案 1 :(得分:3)

你试过这个吗?

将android-sdk-mac_x86 / platform-tools和android-ndk-r5b添加到PATH环境。之后,使用ndk-gdb脚本启动gdb模式。

M-x gdb
Run gdb (like this): ndk-gdb --verbose --start --project=your_NDK_project_dir