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

发布时间 - 2026-01-11 02:56:54    点击率:

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 62025e4a 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 62025e4a 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 <android/log.h> 
#include <cstring> 
#include <cstdlib> 
 
// 一般定义在公共文件 
#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 ? 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 < lines * 16; i++) { 
    if (16 == n) { 
      strcat(buf, "\n");//注释A:占一个字符 
      n = 0; 
    } 
    if (n > 0 && i > 0) { 
      strcat(buf, " ");//注释A:占一个字符 
    } 
    memset(temp, 0, 16); 
    if (i < size) { // 在text字符串内则打印字符串内容,超过text长度则打印00 
      snprintf(temp, 16, "%02x", *(text + i));//注释B:占两个字符 
    } else { 
      snprintf(temp, 16, "%02x", 0);//注释B:占两个字符 
    } 
    strcat(buf, temp); 
    ++n; 
  } 
  *(buf + LEN - 1) = '\0'; // 注意字符串结束 
  ldebug(TAG, "%s", buf); 
  free(buf); 
  buf = NULL; 
} 

测试调用代码

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/log.h>记得在Android.mk添加

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

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


# Android  # jni调试打印char阵列  # jni调试打印信息  # Android实现PDF预览打印功能  # Android gradle插件打印时间戳的方法详解  # Android编程实现计算两个日期之间天数并打印所有日期的方法  # Android中如何安全地打印日志详解  # Mac 下 Android Studio 不打印日志的解决办法  # Android下的POS打印机调用的简单实现  # Android 蓝牙连接 ESC/POS 热敏打印机打印实例(ESC/POS指令篇)  # Android 蓝牙连接 ESC/POS 热敏打印机打印实例(蓝牙连接篇)  # Android打印机--小票打印格式及模板设置实例代码  # Android进阶——安卓调用ESC/POS打印机打印实例  # Android手机通过蓝牙连接佳博打印机的实例代码  # Android实现系统打印功能  # 是一个  # 是一种  # 是因为  # 如有  # 希望能  # 较强  # 谢谢大家  # 会像  # 疑问请  # scr  # backtrace  # c07422af5ad9a77f  # ad34fbe9e  # a2fe0391c1ee451b  # system  # SSL_do_handshake  # libjavacrypto  # c67f  # ssl3_connect  # bf 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  详解阿里云nginx服务器多站点的配置  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  如何在云主机快速搭建网站站点?  如何将凡科建站内容保存为本地文件?  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  Laravel如何自定义错误页面(404, 500)?(代码示例)  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  高防服务器租用首荐平台,企业级优惠套餐快速部署  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何快速搭建高效服务器建站系统?  公司网站制作价格怎么算,公司办个官网需要多少钱?  如何挑选优质建站一级代理提升网站排名?  如何在IIS中新建站点并解决端口绑定冲突?  如何安全更换建站之星模板并保留数据?  如何用虚拟主机快速搭建网站?详细步骤解析  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  javascript读取文本节点方法小结  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  如何获取免费开源的自助建站系统源码?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Python文件异常处理策略_健壮性说明【指导】  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何在景安服务器上快速搭建个人网站?  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  实例解析Array和String方法  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel如何使用Service Container和依赖注入?(代码示例)  如何为不同团队 ID 动态生成多个独立按钮  canvas 画布在主流浏览器中的尺寸限制详细介绍  Laravel怎么实现模型属性的自动加密  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?