android ndk和x27的集成;带emacs的ndk gdb?

android ndk和x27的集成;带emacs的ndk gdb?,android,emacs,gdb,android-ndk,Android,Emacs,Gdb,Android Ndk,谁能告诉我如何使用gdb模式在emacs内运行ndk-gdb?我目前正在shell缓冲区中运行它。我想要的是,当我中断或步进时,自动将源文件缓冲区与gdb中的当前pc同步。此外,设置源代码的中断、显示gdb局部变量的缓冲区等,以及gdb命令的快捷键都是很重要的 背景:我正在2010-12-15年的GNU Emacs 23.1.90.1(i386-apple-darwin10.5.0,NS apple-appkit-1038.35)中开发,在OSX 10.6.6上使用android模式,使用and

谁能告诉我如何使用gdb模式在emacs内运行ndk-gdb?我目前正在shell缓冲区中运行它。我想要的是,当我中断或步进时,自动将源文件缓冲区与gdb中的当前pc同步。此外,设置源代码的中断、显示gdb局部变量的缓冲区等,以及gdb命令的快捷键都是很重要的

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

emacs中的Android模式和shell(运行ndk gdb)允许我查看所需的一切,但如果我可以获得与调试器同步的源缓冲区,或者获得EmacsWiki中描述的等效缓冲区,我的设置将更加方便

仅供参考,我目前正在使用eclipse进行java端调试和开发,但是发现它不稳定,并且很难为本机工作进行设置,尽管有可用性,而且eclipse不是emacs

[附件]

使用ndk gdb作为gdb命令运行M-x gdb(见下文)会产生一个名为gud的缓冲区,其中的modeline表示“(调试器:运行[Initialization…])。缓冲区不接受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". 当前目录是/Users/jpschelter/ Android NDK安装路径:/Developer/Android-NDK-r5b 使用特定的adb命令:/Developer/android-sdk-mac_x86/platform tools/adb ... ... ... ... (未找到调试符号) 警告:找不到动态链接器断点函数。 GDB将无法调试共享库初始值设定项 并跟踪显式加载的动态代码。 nonosleep()中的0xafd0e21c来自/Developer/Projects/ECS/DIGG/Projects/droid/obj/local/armeabi/libc.so (gdb)未定义的命令:“1-subsier-tty-set”。请尝试“help”。 (gdb)未定义的命令:“2-gdb-set”。请尝试“帮助”。 (gdb)未定义命令:“3-gdb-set”。请尝试“帮助”。 (gdb)未定义命令:“4-file-list-exec-source-files”。请尝试“帮助”。 (gdb)未定义命令:“5-file-list-exec-source-file”。请尝试“帮助”。 (gdb)未定义的命令:“6-gdb-show”。请尝试“help”。 (gdb)未定义命令:“7-stack-info-frame”。请尝试“help”。 (gdb)未定义命令:“8-thread-info”。请尝试“help”。 (gdb)未定义命令:“9-break-list”。请尝试“help”。 也会创建名为*的
*线程、*
*输入/输出和*
*断点的缓冲区,但这些缓冲区是空的

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

请注意,使用ndk gdb的命令行运行M-x gud gdb似乎会导致在shell中运行ndk gdb,因此问题似乎出现在emacs中gdb模式的配置中。

您尝试过这个吗

将android-sdk-mac_x86/platform工具和android-ndk-r5b添加到PATH环境中,然后使用ndk-gdb脚本启动gdb模式

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

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

呼叫GDB(最后一行)时,执行以下操作:

$GDBCLIENT --annotate=3 -x `native_path $GDBSETUP`
(gdb (concat "ndk-gdb --project=" desktop-dirname ...))
--annotate=3选项对于emacs gud接口是必需的,没有它它就无法工作(这就是为什么*gud*没有响应)

但你已经做了一半。现在它可以工作了,但前提是你在缓冲区中从项目根目录下的文件(比如AndroidManifest.xml)调用ndk gdb。由于您是一名C/C++程序员,并且您正在处理的源代码位于jni目录或更高的目录下,因此大多数情况下这是不太可能的,因此您需要做更多的工作。ndk gdb脚本有点错误,它会很高兴地让您在这一点上感到困惑(gdb本身也不会有多大帮助)

在脚本中搜索“PROJECT=$OPTION\u 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和内容复制到其中)。因此,请使用该死的--project选项。如果您使用的是emacs desktop命令集,请执行以下操作:

$GDBCLIENT --annotate=3 -x `native_path $GDBSETUP`
(gdb (concat "ndk-gdb --project=" desktop-dirname ...))
(当然,假设您的.emacs.desktop是项目的根目录)

现在您终于可以使用GUDUI进行调试,在源代码级别设置断点。
注意,我使用的是emacs 23.3.1(gdb ui.el),所以不需要24个就可以了。

奇怪的是,我的PATH环境变量没有被emacs gdb获取。我必须这样做,'/Developer/android-ndk-r5b/ndk-gdb--verbose--start--adb=/Developer/android-sdk-mac_x86/platform tools/adb--project=/Developer/Projects/testproj'在我上面的编辑中,是的,我尝试过像那样运行gdb