Android jni調(diào)試打印char陣列的實(shí)例詳解
Android jni調(diào)試打印char陣列的實(shí)例詳解
前言:
在android開發(fā)中,用jni有時(shí)候需要打印某一個(gè)字符串的二進(jìn)制格式輸出,比較友好的輸出格式是一個(gè)四列,八列,十六列的矩陣格式。類似在錯(cuò)誤刪除野指針時(shí)出現(xiàn)如下錯(cuò)誤:
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以下就是一個(gè)五列矩陣,這種打印格式的可讀性比較強(qiáng)。最近項(xiàng)目中需要使用加密算法,因此調(diào)試時(shí)打印矩陣是一種不錯(cuò)的選擇。由于android jni提供的接口時(shí)
__android_log_write
每次打印都會一行,不會像printf方便。因此需要對__android_log_write進(jìn)行二次封裝。思路就是先申請一段空間,然后把打印的內(nèi)容存儲在該內(nèi)存中,最后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是因?yàn)榇蛴r(shí)傳入的每個(gè)字符char字符占三個(gè)位置。見注釋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:占一個(gè)字符 n = 0; } if (n > 0 && i > 0) { strcat(buf, " ");//注釋A:占一個(gè)字符 } memset(temp, 0, 16); if (i < size) { // 在text字符串內(nèi)則打印字符串內(nèi)容,超過text長度則打印00 snprintf(temp, 16, "%02x", *(text + i));//注釋B:占兩個(gè)字符 } else { snprintf(temp, 16, "%02x", 0);//注釋B:占兩個(gè)字符 } strcat(buf, temp); ++n; } *(buf + LEN - 1) = '\0'; // 注意字符串結(jié)束 ldebug(TAG, "%s", buf); free(buf); buf = NULL; }
測試調(diào)用代碼
void testPrintMatrix() { char temp[] = "Hello, this is print_matrix's test case."; print_matrix(temp, sizeof(temp)); }
輸出結(jié)果
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
說明,因?yàn)槭褂?lt;android/log.h>記得在Android.mk添加
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Android實(shí)現(xiàn)PDF預(yù)覽打印功能
- Android gradle插件打印時(shí)間戳的方法詳解
- Android編程實(shí)現(xiàn)計(jì)算兩個(gè)日期之間天數(shù)并打印所有日期的方法
- Android中如何安全地打印日志詳解
- Mac 下 Android Studio 不打印日志的解決辦法
- Android下的POS打印機(jī)調(diào)用的簡單實(shí)現(xiàn)
- Android 藍(lán)牙連接 ESC/POS 熱敏打印機(jī)打印實(shí)例(ESC/POS指令篇)
- Android 藍(lán)牙連接 ESC/POS 熱敏打印機(jī)打印實(shí)例(藍(lán)牙連接篇)
- Android打印機(jī)--小票打印格式及模板設(shè)置實(shí)例代碼
- Android進(jìn)階——安卓調(diào)用ESC/POS打印機(jī)打印實(shí)例
- Android手機(jī)通過藍(lán)牙連接佳博打印機(jī)的實(shí)例代碼
- Android實(shí)現(xiàn)系統(tǒng)打印功能
相關(guān)文章
Android 進(jìn)入設(shè)備后臺data文件夾的辦法
Android 進(jìn)入設(shè)備后臺data文件夾的辦法,需要的朋友可以參考一下2013-05-05淺談Android手機(jī)聯(lián)系人開發(fā)之增刪查改功能
這篇文章主要介紹了Android手機(jī)聯(lián)系人開發(fā)之增刪查改功能,需要的朋友可以參考下2017-05-05Android LayoutInflater加載布局詳解及實(shí)例代碼
這篇文章主要介紹了Android LayoutInflater加載布局詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Android自定義實(shí)現(xiàn)圖片加文字功能
這篇文章主要介紹了Android自定義實(shí)現(xiàn)圖片加文字功能的相關(guān)資料,需要的朋友可以參考下2017-05-05android 左右滑動+索引圖標(biāo)實(shí)現(xiàn)方法與代碼
使用Gallery和ImageView實(shí)現(xiàn)android左右滑動+索引圖標(biāo)效果,接下來詳細(xì)介紹,有需要的朋友可以參考下2012-12-12Android 圓角邊框的實(shí)現(xiàn)方式匯總
這篇文章主要介紹了Android 圓角邊框的實(shí)現(xiàn)方式匯總的相關(guān)資料,需要的朋友可以參考下2016-03-03