首页 文章

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

提问于
浏览
20

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

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

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

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

[追加]

使用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的命令行运行M-x gud-gdb似乎导致相当于在shell中运行ndk-gdb,因此问题似乎在emacs中的gdb-mode配置中 .

2 回答

  • 3

    在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 ...")
    

    Do not 使用gud-gdb(奇怪的是,这是旧的emacs使用gdb的方式,并且与你的好用户界面无关,而且你在一个缓冲区中用于一个不在项目中的文件,脚本赢了't find the root. Worse, if you' re in在另一个Android项目中的文件,它会找到该项目的根目录(甚至可能在gdb会话失败之前将gdb.setup和东西复制到其中) . 所以给那个该死的--project选项 . 如果你正在使用emacs桌面命令集,执行此操作:

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

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

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

  • 4

    你试过这个吗?

    将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
    

相关问题