NDK DEBUG方法

NDK中的常见错误:

Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad

面对这种native程序异常crash掉,而且还毫无征兆和提示,让人觉得很是崩溃。

在Android程序上调试C代码,是件很痛苦的事情

下面介绍两种调试方法:

一、JNI单步调试

ADTr20及以后已经支持JNI单步调试。

你现在需要做的只需以下2步:

1、使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件

2、在项目的Debug Configuration中选择Android Native Apllication,点击下方Debug。程序会进入C代码中断点处。

此种方法还是很有缺陷性,繁琐不方便,而且效率也不是很高。下面介绍方法二,超级实用,定点错误快

二、借用NDK-STACK调试工具

1.ndk-satck 位于NDK目录下。

运行方法:$SDK_PATH/adb logcat | $NDK_PATH/ndk-stack -sym 你的工程.so文件目录

如。

adb logcat |ndk-stack -sym /Applications/android/workspaceluna/antexmobile/obj/local/armeabi

因为我的sdk和ndk都已经加入到环境变量中,所以没有adb和ndk-stack前面没有加上文件路径

正确配置后会在终端出现

- waiting for device -

2.配置Android.mk

加上如下内容

#对应AndroidManifest.xml中的minSdkVersion。用于debug

APP_PLATFORM := android-14

APP_OPTIM        := debug

APP_ABI := armeabi

APP_STL := gnustl_static

NDK_DEBUG = 1

#debug

或者:在AndroidManifest.xml 设置

android:debuggable="true"

在Application选项中(如果报错,选中当前的问题,右键“quick fix”, 选中
“Disable Check in This File Only”,点击 Finish 即可)

3.启动程序,native crash掉后,终端会打印出错误信息

重要的就是 c/cpp行号。为我们定位崩溃地点很有作用,再结合程序的打印输出位置,就能很快定位问题了。

总结:NDK中常见错误,就是指针使用不当。

1.空指针。

2.(char*)malloc(len
+ 1)),申请空间大小时,要加1,并且最后一个字节值置为0,表示字符串结尾。动态申请的内存,用完后要及时free掉,避免内存泄露

3.msg=strcat(msg,"\r\n"),使用此方法时,msg的大小要足够大,能够容纳下,自身长度加上追加内容的长度

另一个常见错误就是局部引用与全局引用。

JNI WARNING: 0x40538d98 is not a valid JNI reference

这个错误比较好解决。用NewGlobalRef将其转换成全局引用

// FindClass仅返回局部引用.需将其转换成全局引用

jclass stringClass = (*env)->FindClass(env,"java/lang/String");

strClass=(*env)->NewGlobalRef(env,stringClass);

// NewStringUTF仅返回局部引用.需将其转换成全局引用

jstring coding = (*env)->NewStringUTF(env,"utf-8");

strencoding=(*env)->NewGlobalRef(env,coding);

时间: 2024-10-10 05:57:28

NDK DEBUG方法的相关文章

使用AndroidStudio编译NDK的方法及错误解决方式

參考资料: [android ndk]macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfoucs.com/ashqal/article/details/21869151 ANDROID STUDIO, GRADLE AND NDK INTEGRATION:http://ph0b.com/android-studio-gradle-and-ndk-integration/ Gradle Plugin User Guide:http:

使用AndroidStudio编译NDK的方法及错误解决方案

参考资料: [android ndk]macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfoucs.com/ashqal/article/details/21869151 ANDROID STUDIO, GRADLE AND NDK INTEGRATION:http://ph0b.com/android-studio-gradle-and-ndk-integration/ Gradle Plugin User Guide:http:

[Android]Cygwin使用及NDK编译方法

在Windows XP, Cygwin, NDK SDK r5b下成功编译了ffmpeg,下面是完整的编译过程: 一.准备工作 2.下载Cygwin, 请猛击这里 3.下载Android SDK,请猛击这里,Android SDK的网页 4.下载Android NDK SDK r5b, 请猛击这里,NDK SDK的网页 5.下载ffmpeg,可以下载压缩包,也可以git一个snapshot 好了,有必要说明一下Android SDK和Android NDK SDK的区别: Android SDK

音频软件开发中的debug方法和工具

本文系作者原创.如转载,请注明出处. 谢谢! 音频软件开发同其他软件开发一样,都需要去调试.音频软件调试同其他软件调试方法有相同的地方,也有不同的地方,同时调试时还需要借助一些专门的工具,有了这些方法和工具,就能快速的定位问题和解决问题.下面我们就谈谈这些方法和工具. 1,方法 1)log 这是软件调试中最常用的方法,音频调试也不例外.在写代码时加上一定的log, 在出问题时就打开这些log,通过log分析问题出在什么地方.一个好的log体现在如下几点: a)    要有时间和日期,有时候时间戳

C#中的两种debug方法介绍

第一种:需要把调试方法改成debug 代码用 #if DEBUG 包裹 using System; using System.Collections.Generic; using System.Text; using System.IO; namespace SplitPackage { public static class EnvConfig { static EnvConfig() { #if DEBUG ToolsPath = @"D:\workspace\shopstyle\tool&

TOMCAT-IDEA远程debug方法

在很多情况下,tomcat本地启动并不足以完全模拟线上环境,所以,有时候我们可能需要远程debug方法去调试,下面附上远程idea debug方法: IDEA中,选择 Run/Debug Configuration——>edit Configurations 在打开的窗口中单击左上角绿色"+"号,选择Remote 在右侧Settings下,填写Hosts为远程ip,端口为8000 修改远程tomcat中的startup.sh最后一行 <在tomcat的bin目录下>

C# 的两种debug 方法

第一种:需要把调试方法改成debug代码用 #if DEBUG 包裹 using System; using System.Collections.Generic; using System.Text; using System.IO; namespace SplitPackage { public static class EnvConfig { static EnvConfig() { #if DEBUG ToolsPath = @"D:\workspace\shopstyle\tool&q

Linux下进程间Socket通信调试debug方法

在一个复杂的软件系统中,往往需要有各个组件之间的数据传递,在组件间数据传递过程中,又会不可避免的出现一些小问题,这时候我们就需要来进行debug了,由于最近的一个系统使用到了collectd和rrdcached来收集数据和画图,它们之间采用了Unix socket通信,因此小小的学习了一下相关知识. 首先我们来回忆下Linux下进程通信有哪些方法: 管道(Pipe)及有名管道(FIFO)\UNIX BSD 信号(Signal) \UNIX BSD 报文消息队列(Message)\UNIX sys

Mac下 eclipse中C/C++ debug方法

eclipse中安装好了cdt插件,编写好c/c++代码,run正常,今天debug时出现如下图错误 百度知,没有安装GDB调试工具,遂安装.方法如下: 1.需要安装有homebrew,homebrew 是一个包管理器.homebrew网站地址:http://brew.sh/index_zh-cn.html homebrew安装方法:打开终端窗口, 粘贴以下脚本 <span style="white-space:pre"> </span>ruby -e &quo