如何使用Eclipse调试Android上的c++代码
How to debug C++ code on Android by using Eclipse?
我在PC上编写了一些视频流媒体(C++
),现在我尝试在Android上实现相同的跨平台部分。我"玩"够了NDK
,知道一点关于如何编译和集成C
代码与Android(又名JNI)。
问题是,有时我的应用程序崩溃,如你所知,Android不会指出我代码失败的地方(在C/c++部分)。
Video Streamer代码有很多库,比如说,我用来留下日志的开源部分——这不是一个好主意。我使用Eclipse, 我如何调试c++代码或Eclipse有任何插件调试?
谢谢,
要记录内容并在Android的logcat中查看,我有一个简单的类:
#ifndef LOG_H_
#define LOG_H_
#include <android/log.h>
#define LOGD(LOG_TAG, ...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(LOG_TAG, ...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define LOGV(LOG_TAG, ...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__)
#define LOGW(LOG_TAG, ...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
#define LOGE(LOG_TAG, ...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif /* LOG_H_ */
你可以这样使用:
LOGI("YourClassTag","let's print some stuff: %i, %s", 4, "I'm a string");
要获得有关某些崩溃的更多信息,您可以尝试使用adb:
启用JNICheck。如果您有一个普通的设备,您可以使用以下命令:
adb shell setprop debug.checkjni 1
这不会影响已经运行的应用程序,但任何从它启动的应用程序点将启用CheckJNI。(将属性更改为任何其他值或重新启动将再次禁用CheckJNI。)在这种情况下,下次执行命令时,您将在logcat输出中看到类似的内容应用程序开始:
D启用CheckJNI
针对本地代码的GDB (GNU Debugger)从Android 2.2 (SDK level 8)开始可用。
在命令行中使用NDK_DEBUG=1
选项重新构建NDK代码。启动应用程序,然后在Windows或Cygwin命令行中调用"ndk-gdb"命令,同时项目下的jni文件夹为当前文件夹。您将获得一个GDB控制台。输入c
并按Enter键继续执行程序(GDB连接时暂停)。
但这不是为精神虚弱的人准备的。GDB以其简洁的接口而闻名。但至少它会在崩溃发生时为您提供崩溃的堆栈回溯(bt
命令)。
您也可以将GDB连接到运行在早期版本的Android上的进程,但是这个过程相当棘手。
- Linux的Cpp上的计时器
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 物理键盘上的触发器按键
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 集合上的输出迭代器:assign和increment迭代器
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 对于set上的循环-获取next元素迭代器
- 如何从棋盘上的箱号中找到行和列
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- if数组上的随机数
- 向量上的线性搜索
- 位阵列上的快速AND运算
- 无法将 GLFW 库与 Ubuntu 18.04 上的头文件链接
- 为什么一个向量上的多线程操作很慢
- 64位机器上的C++内存对齐
- 跟踪滚动条上的鼠标事件