热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Androidjni调试打印char阵列的实例详解

这篇文章主要介绍了Androidjni调试打印char阵列的实例详解的相关资料,通过此文希望能帮助到大家实现这样的功能,需要的朋友可以参考下

Android jni调试打印char阵列的实例详解

前言:

在android开发中,用jni有时候需要打印某一个字符串的二进制格式输出,比较友好的输出格式是一个四列,八列,十六列的矩阵格式。类似在错误删除野指针时出现如下错误:

pid: 2721, tid: 3005, name: pool-5-thread-5 >>> onxmaps.hunt <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadbaad 
Abort message: 'invalid address or address of corrupt block 0x7e31e028 passed to dlfree' 
r0 00000000 r1 4011917a r2 deadbaad r3 4011cd0d 
r4 7e31e028 r5 40127190 r6 41b54000 r7 7e31e030 
r8 00000003 r9 7ed97bb5 sl 00000001 fp 7ed97bb9 
ip 00000001 sp 82a7d9c0 lr 400ea873 pc 400ea874 cpsr 600f0030 
d0 2064696c61766e69 d1 2073736572646461 
d2 657264646120726f d3 6f6320666f207373 
d4 3fd34413509f79fb d5 41568f570e698a86 
d6 412e848000000000 d7 00000400fb561fc7 
d8 7ff0000000000000 d9 41568c0b304b0668 
d10 408f400000000000 d11 0000000000000000 
d12 0000000000000000 d13 0000000000000000 
d14 0000000000000000 d15 0000000000000000 
d16 c07422af5ad9a77f d17 010001ff0d000013 
d18 6743a514430fcb23 d19 657fcd52992ddb94 
d20 4820450ad34fbe9e d21 a2fe0391c1ee451b 
d22 bf5544b8ce928c56 d23 d4404b0a8749e7f1 
d24 3fd5555555555555 d25 391377ce858a5d48 
d26 bca0000000000000 d27 3940000000000000 
d28 3ff0000000000000 d29 bef375cbdb605373 
d30 412e848000000000 d31 3fd5555555555563 
scr 60000013 
 
backtrace: 
#00 pc 00011874 /system/lib/libc.so (dlfree+1191) 
#01 pc 0000dd13 /system/lib/libc.so (free+10) 
#02 pc 00082485 /system/lib/libcrypto.so (CRYPTO_free+24) 
#03 pc 0002aa85 /system/lib/libssl.so (ssl_parse_serverhello_tlsext+244) 
#04 pc 00016bbd /system/lib/libssl.so (ssl3_get_server_hello+904) 
#05 pc 000196bf /system/lib/libssl.so (ssl3_connect+642) 
#06 pc 00024f55 /system/lib/libssl.so (SSL_do_handshake+72) 
#07 pc 0000c67f /system/lib/libjavacrypto.so 
#08 pc 00020bcc /system/lib/libdvm.so (dvmPlatformInvoke+112) 
#09 pc 00051927 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+398) 
#10 pc 0002a060 /system/lib/libdvm.so 
#11 pc 00031510 /system/lib/libdvm.so (dvmMterpStd(Thread*)+76) 
#12 pc 0002eba8 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184) 
#13 pc 00063e75 /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+336) 
#14 pc 00063e99 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+20) 
#15 pc 00058b6b /system/lib/libdvm.so 
#16 pc 0000d278 /system/lib/libc.so (__thread_entry+72) 
#17 pc 0000d410 /system/lib/libc.so (pthread_create+240) 
 
code around pc: 
400ea854 6a014478 62021e4a f7fdb95a e008fd39 
400ea864 4621482a 44784a2a f001447a 4a13f9b3 
400ea874 49286014 f8d14479 079a31bc f501d51c 
400ea884 e8bd70e0 f02c40f8 4823b895 f7fd4478 
400ea894 4822fd0d e7fa4478 42b7688f ae10f43f 
400ea8a4 481fe611 e7f24478 4478481e 6888e7ef 
400ea8b4 f43f4298 e606aed4 bf00bdf8 deadbaad 
400ea8c4 0003cdae 0003cda0 0003cd08 0003283b 
400ea8d4 0003cc7c 0003cc6a 0003cbf2 0003cbd0 
400ea8e4 0003cb74 0003cb5e 0003caf8 0003cae0 
400ea8f4 0003cace 0003ca76 0003ca50 0003c9c6 
400ea904 0003c970 0003c956 0003c938 0002e90c 
400ea914 0003249d 0003c914 00032479 00032471 
400ea924 00032461 0003245b 460db538 b1704601 
400ea934 0200ea45 f405fb00 04030c10 4620b143 
400ea944 ef24f028 bf1842a8 34fff04f 4604e000 
 
code around lr: 
400ea850 482e61a3 6a014478 62021e4a f7fdb95a 
400ea860 e008fd39 4621482a 44784a2a f001447a 
400ea870 4a13f9b3 49286014 f8d14479 079a31bc 
400ea880 f501d51c e8bd70e0 f02c40f8 4823b895 
400ea890 f7fd4478 4822fd0d e7fa4478 42b7688f 
400ea8a0 ae10f43f 481fe611 e7f24478 4478481e 
400ea8b0 6888e7ef f43f4298 e606aed4 bf00bdf8 
400ea8c0 deadbaad 0003cdae 0003cda0 0003cd08 
400ea8d0 0003283b 0003cc7c 0003cc6a 0003cbf2 
400ea8e0 0003cbd0 0003cb74 0003cb5e 0003caf8 
400ea8f0 0003cae0 0003cace 0003ca76 0003ca50 
400ea900 0003c9c6 0003c970 0003c956 0003c938 
400ea910 0002e90c 0003249d 0003c914 00032479 
400ea920 00032471 00032461 0003245b 460db538 
400ea930 b1704601 0200ea45 f405fb00 04030c10 
400ea940 4620b143 ef24f028 bf1842a8 34fff04f 

谷歌的工程师非常老道,在code around pc以下就是一个五列矩阵,这种打印格式的可读性比较强。最近项目中需要使用加密算法,因此调试时打印矩阵是一种不错的选择。由于android jni提供的接口时

__android_log_write

每次打印都会一行,不会像printf方便。因此需要对__android_log_write进行二次封装。思路就是先申请一段空间,然后把打印的内容存储在该内存中,最后log输出。

具体代码如下:

#include  
#include  
#include  
 
// 一般定义在公共文件 
#define ldebug(tag, format, ...) {__android_log_write(tag, format, ##__VA_ARGS__);} 
#define TAG "345" 
 
void print_matrix(char *text, size_t size) { // 打印16列的矩阵 
  char temp[16] = {0}; 
  size_t lines = (size + 15) / 16; // 保证打印的整行的矩阵 
  lines = lines > 0 &#63; lines : 1; // 最小为一 
  const size_t LEN = lines * 16 * 3 + 1; // 给打印buf申请足够的buffer。 乘3是因为打印时传入的每个字符char字符占三个位置。见注释AB 
  char *buf = (char*)malloc(LEN * sizeof(char)); 
  if (NULL == buf) { 
    return; 
  } 
  memset(buf, 0, LEN); 
  int n = 0; 
  for (size_t i = 0; i  0 && i > 0) { 
      strcat(buf, " ");//注释A:占一个字符 
    } 
    memset(temp, 0, 16); 
    if (i 

测试调用代码

void testPrintMatrix() { 
  char temp[] = "Hello, this is print_matrix's test case."; 
  print_matrix(temp, sizeof(temp)); 
} 

输出结果

08-03 18:46:03.101 D/345 (30611): testPrintMatrix
08-03 18:46:03.101 D/345 (30611): 48 65 6c 6c 6f 2c 20 74 68 69 73 20 69 73 20 70
08-03 18:46:03.101 D/345 (30611): 72 69 6e 74 5f 6d 61 74 72 69 78 27 73 20 74 65
08-03 18:46:03.101 D/345 (30611): 73 74 20 63 61 73 65 2e 00 00 00 00 00 00 00 00

说明,因为使用记得在Android.mk添加

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
  • “你永远都不知道明天和‘公司的意外’哪个先来。”疫情期间,这是我们最战战兢兢的心情。但是显然,有些人体会不了。这份行业数据,让笔者“柠檬” ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • JavaScript设计模式之策略模式(Strategy Pattern)的优势及应用
    本文介绍了JavaScript设计模式之策略模式(Strategy Pattern)的定义和优势,策略模式可以避免代码中的多重判断条件,体现了开放-封闭原则。同时,策略模式的应用可以使系统的算法重复利用,避免复制粘贴。然而,策略模式也会增加策略类的数量,违反最少知识原则,需要了解各种策略类才能更好地应用于业务中。本文还以员工年终奖的计算为例,说明了策略模式的应用场景和实现方式。 ... [详细]
author-avatar
天涯老许_137
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有