调试Android上的c/c++程序一直是个难题,以前我经常靠输出log来解决问题,对于稍复杂一些的工程,这几乎是个不可能完成的任务,尤其有些错误,在wincewindows下都没事,只在android上出现,就更难找了。后来看了些资料,知道可以用gdbserver来调试,今天决定必须把这个先弄清楚,不然以后干活效率实在是太低了,找了很多网站,终于成功了。这里把整个过程整理一下,以备以后查阅。
1. 准备gdbserver。
android 1.0 代码刚开放到时候,里面并没有带gdbserver,有些强人就自己编译了gdbserver来使用。不过现在好了,android的新源码里已经包含了gdbserver,就在prebuilt目录下。如果想在android 1.0里使用,可以到如下地址下载:
http://android.git.kernel.org/?p=platform/prebuilt.git;a=tree。gdbserver的二进制文件就在android-arm/gdbserver/gdbserver,我们只需要把gdbserver这个可执行文件放到模拟器上即可。
准备把它放在/system/bin,这样它就在默认的PATH里了。启动模拟器后:
adb push gdbserver /system/bin
如果提示文件系统不可写的话,执行一下“adb remount”,因为默认是用只读模式挂载的。
2. 编译程序。
默认情况下,android的编译系统在编译程序时已经使用了“-g”选项,即已经生成了调试信息。但是在生成最终的文件时,是经过strip的,去除了所有到调试信息。所以最终我们到调试目标要使用strip之前的文件。用make showcommands查看详细的命令信息,下面是其中某次的输出:
target Executable: libomstts (out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/LINKED/libomstts)
prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-g++ -nostdlib -Bdynamic -Wl,-T,build/core/armelf.x -Wl,-dynamic-linker,/system/bin/linker -Wl,--gc-sections -Wl,-z,nocopyreloc -o out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/LINKED/libomstts -Lout/target/product/generic/obj/lib -Wl,-rpath-link=out/target/product/generic/obj/lib -llog -lcutils -lutils -landroid_runtime -lnativehelper -lstdc++ -lz -lc -lstdc++ -lm out/target/product/generic/obj/lib/crtbegin_dynamic.o out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/src/tts.o out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/src/TTSWrapper.o out/target/product/generic/obj/lib/crtend_android.o
target Non-prelinked: libomstts (out/target/product/generic/symbols/system/bin/libomstts)
out/host/linux-x86/bin/acp -fpt out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/LINKED/libomstts out/target/product/generic/symbols/system/bin/libomstts
target Strip: libomstts (out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/libomstts)
out/host/linux-x86/bin/soslim --strip --shady --quiet out/target/product/generic/symbols/system/bin/libomstts --outfile out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/libomstts
Install: out/target/product/generic/system/bin/libomstts
out/host/linux-x86/bin/acp -fpt out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/libomstts out/target/product/generic/system/bin/libomstts
生成的可执行文件是libomstts,可以看到,初次链接的目标文件是“out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/LINKED/libomstts”,然后拷贝到“out/target/product/generic/symbols/system/bin/libomstts”,strip后的文件是“out/target/product/generic/obj/EXECUTABLES/libomstts_intermediates/libomstts”和“out/target/product/generic/system/bin/libomstts”。调试只能使用前两个文件。
把带调试信息到可执行文件放到模拟器上,我用到是“out/target/product/generic/symbols/system/bin/libomstts”:
adb push out/target/product/generic/symbols/system/bin/libomstts /system/bin
3. 启动调试器
首先在模拟器上启动gdbserver:
adb shell
进入模拟器的控制台后
gdbserver 10.0.2.2:1234 /system/bin/libomstts
10.0.2.2是模拟器的默认ip地址,让gdbserver在模拟器上监听1234端口。如果启动成功会显示以下信息:
Process /system/bin/libomstts created; pid = 1025
Listening on port 1234
为来让gdb能连接到模拟器上到gdbserver,必须进行数据转发:
telnet localhost 5554
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Android Console: type 'help' for a list of commands
OK
redir add tcp:1234:1234
OK
exit
上面的telnet localhost 5554,redir add tcp:1234:1234,exit是自己输入的命令,其他的是输出信息。5554是模拟器控制台的监听端口,这些命令是将所有到localhost:1234的数据转发到模拟器的1234端口。
最后在本机启动gdb:
arm-eabi-gdb out/target/product/generic/symbols/system/bin/libomstts
arm-eabi-gdb是android自带的toolchain里的,注意后面的可执行文件是strip之前的。
gdb启动后,在gdb里输入命令连接gdbserver:
target remote localhost:1234
连接到gdbserver成功后,就可以使用所有的gdb调试命令啦
现在的这个gdbserver还不能调试动态链接库,只能先编译成可执行文件调试。
相关推荐
C/C++ DevTools Support (DWARF) 是一套专门针对C和C++开发工具的增强支持,它利用了DWARF调试信息格式来提供更高效、详细的调试体验。DWARF是一种广泛使用的二进制文件调试标准,尤其在编译器、链接器和调试器之间...
在Android开发中,JNI(Java Native Interface)是一个关键的组件,允许Java代码调用本地(C/C++)代码,反之亦然。这对于性能敏感的应用、底层库的集成以及利用现有C/C++库是非常有用的。本教程将聚焦于如何在...
"name": "C/C++: g++ build and debug active file", "type": "cppdbg", "request": "launch", "program": "${file}", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [],...
Eclipse是一款广泛使用的开源集成开发环境(IDE),它支持多种编程语言,包括Java、Python、C和C++。对于C/C++开发者来说,Eclipse通过一个名为C/C++ Development Toolkit (CDT) 的插件提供了强大的开发环境。下面将...
This repository contains the source code for the WifiChat. Please see the issues section to report any bugs or feature requests and to see the list of known issues. Debug mode: // src/szu/wifichat/...
Dev-C++是一款经典的开源、免费的C语言和C++集成开发环境(IDE),它为程序员提供了编写、编译、调试代码的一体化平台。这款工具因其简洁易用的界面和强大的功能,在初学者和专业开发者中都享有较高的声誉。 1. **...
Microsoft Visual C++/CLI Step by Step (pdf + ePub) Publisher: Microsoft Press (August 2, 2013) Language: English ISBN-10: 0735675171 ISBN-13: 978-0735675179 Your hands-on guide to Visual C++/CLI ...
5. 创建和运行C/C++程序:现在你可以创建一个新的C或C++文件,编写代码,然后通过VSCode的任务(Tasks)或者调试(Debug)功能来编译和运行你的程序。 视频教程将更详细地指导你完成以上步骤,包括可能出现的问题及...
2. 启动调试会话:"Run" > "Debug Configurations",选择"C/C++ Application",配置启动参数,然后运行。 3. 在调试视图中,可以单步执行、查看变量值、调用堆栈、内存和表达式评估等。 七、版本控制系统集成 ...
一定要保证在类路径ClassPath中有该jar包,并且保证在JAVA库路径JAVA Library Path中有本地库Native Library(\workspace\"Web应用"\WebRoot\WEB-INF\lib\下最好也要加入该jar包)。"SQLite.JDBCDriver"作为JDBC的...
### 使用Eclipse进行C/C++程序调试 #### 概述 Eclipse 是一款非常流行的开源集成开发环境(IDE),广泛应用于各种编程语言的开发中,包括C和C++。通过Eclipse,开发者不仅可以编写代码,还可以编译、运行以及调试...
熬夜一年多,终于把C/C++语言反编译器的演示版本搞出来了! 目前C语言的基本反编译功能已完成,C++部分刚刚开了个头,正在开发中。此版本非常不稳定,仅做演示用!它能很好的反编译自带的56个测试例子,但对于大家...
### VS2015 编译 MongoDB C/C++ 驱动详解 #### 一、概述 本篇文章将详细介绍如何在Windows环境下使用VS2015编译MongoDB的C/C++驱动。整个过程涉及MongoDB数据库安装、CMake安装、Perl安装、OpenSSL编译、Boost库...
Debug 2017/10/21 20:50 文件夹 res 2017/10/21 20:50 文件夹 CLine.h 2008/12/3 13:28 C/C++ Header 0 KB contour.aps 2008/12/8 13:48 APS 文件 29 KB contour.clw 2008/12/8 15:18 CLW 文件 3 KB contour.cpp ...
[{"url":"http://192.168.0.104:8080/app-debug.apk","versionCode":5,"versionName":"1.4.20161008","updateMessage":"版本更新为4"}]
### C/C++ 开发工具用户指南 #### 一、简介 **C/C++ Development Toolkit (CDT)** 是一款专为 C 和 C++ 开发者设计的强大集成开发环境(IDE)工具包,它提供了全面的功能来支持这两种语言的开发工作。本指南旨在帮助...
在开发C或C++项目时,常常需要处理多个源文件,这时就需要一个有效的构建系统来组织和编译这些文件。Visual Studio Code (VSCode) 是一个广受欢迎的代码编辑器,支持多种编程语言,包括C/C++。通过扩展和配置,...
Android Studio 调试 C/C++ 代码(so 文件) Android Studio 是一个功能强大的集成开发环境(IDE),它提供了许多强大的功能来帮助开发者更好地开发 Android 应用程序。其中之一就是调试 C/C++ 代码,这篇文章将...
### Eclipse环境中的C/C++插件使用手册 #### 引言 随着软件开发技术的不断发展,集成开发环境(IDE)已成为提高开发效率不可或缺的工具之一。对于从事C/C++开发的程序员来说,Eclipse作为一款功能强大的开源IDE,...
NDK(Native Development Kit)允许开发者使用C/C++语言编写原生代码,这对于性能敏感的应用场景非常有用。 通过上述介绍,我们可以看到Google为Android开发者提供的全面支持,不仅有基础的开发工具,还有详细的...