gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:15:15 27 4
gpt4 key购买 nike

谁能告诉我如何使用 gdb-mode 在 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) 上使用 android-mode 在 OSX 10.6.6 上开发,使用 android- ndk-r5b 和用于 android 目标的混合 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-r5bUsing 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 initializersand 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 的配置中。

最佳答案

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

在调用 GDB(最后一行)时,执行以下操作:

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

--annotate=3 选项对于 emacs gud 接口(interface)是强制性的,没有它就无法工作(这就是 *gud* 没有响应的原因)。

但你已经成功了。现在它将起作用,但前提是您在项目根目录下的文件(如 AndroidManifest.xml)的缓冲区中调用 ndk-gdb。由于大多数情况下这不太可能,因为您是 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(奇怪的是,这是使用 gdb 的旧 emacs 方式,与您正在搜索的漂亮 UI 无关)。将 ... 替换为您的论点 (concat ...) 或您希望的任何内容。无论如何,我强烈建议使用 --project 选项。如果您不这样做,并且您位于项目外文件的缓冲区中,则脚本将找不到根目录。更糟糕的是,如果您在另一个 Android 项目的文件中,它会找到该项目的根目录(甚至可能在 gdb session 失败之前将 gdb.setup 和其他内容复制到其中)。所以给那个该死的 --project 选项。如果您使用的是 emacs 桌面命令集,请执行以下操作:

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

(当然,假设您的 .emacs.desktop 位于项目的根目录)。

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

关于android - android ndk的ndk-gdb与emacs的集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4970062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com