最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android jni調(diào)試打印char陣列的實例詳解

 更新時間:2017年08月24日 14:28:04   作者:二流小寶  
這篇文章主要介紹了Android jni調(diào)試打印char陣列的實例詳解的相關資料,通過此文希望能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下

Android jni調(diào)試打印char陣列的實例詳解

前言:

在android開發(fā)中,用jni有時候需要打印某一個字符串的二進制格式輸出,比較友好的輸出格式是一個四列,八列,十六列的矩陣格式。類似在錯誤刪除野指針時出現(xiàn)如下錯誤:

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以下就是一個五列矩陣,這種打印格式的可讀性比較強。最近項目中需要使用加密算法,因此調(diào)試時打印矩陣是一種不錯的選擇。由于android jni提供的接口時

__android_log_write

每次打印都會一行,不會像printf方便。因此需要對__android_log_write進行二次封裝。思路就是先申請一段空間,然后把打印的內(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是因為打印時傳入的每個字符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字符串內(nèi)則打印字符串內(nèi)容,超過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; 
} 

測試調(diào)用代碼

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

如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • Android實現(xiàn)氣泡動畫

    Android實現(xiàn)氣泡動畫

    這篇文章主要為大家詳細介紹了Android實現(xiàn)氣泡動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Android自定義videoview仿抖音界面

    Android自定義videoview仿抖音界面

    這篇文章主要為大家詳細介紹了Android自定義videoview仿抖音界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Android中關于相對布局RelativeLayout的技巧匯總

    Android中關于相對布局RelativeLayout的技巧匯總

    RelativeLayout是相對布局控件,以控件之間相對位置或相對父容器位置進行排列。下面這篇文章主要給大家介紹了關于Android中相對布局RelativeLayout的一些技巧,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • Android仿美團分類下拉菜單實例代碼

    Android仿美團分類下拉菜單實例代碼

    這篇文章主要為大家詳細介紹了Android仿美團分類下拉菜單實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Flutter app頁面路由以及路由攔截的實現(xiàn)

    Flutter app頁面路由以及路由攔截的實現(xiàn)

    本篇介紹了介紹了Flutter如何使用路由來實現(xiàn)頁面的跳轉,從而簡化頁面之間的耦合,并可以實現(xiàn)路由攔截。
    2021-06-06
  • Android scrollTo和scrollBy方法使用解析

    Android scrollTo和scrollBy方法使用解析

    在一個View中,系統(tǒng)提供了scrollTo、scrollBy兩種方式來改變一個View的位置,下面通過本文給大家介紹Android scrollTo和scrollBy方法使用解析,需要的朋友參考下吧
    2018-01-01
  • Android Studio打包H5網(wǎng)址頁面,封裝成APK

    Android Studio打包H5網(wǎng)址頁面,封裝成APK

    大家好,本篇文章主要講的是Android Studio打包H5網(wǎng)址頁面,封裝成APK,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android實現(xiàn)列表元素動態(tài)效果

    Android實現(xiàn)列表元素動態(tài)效果

    本文將利用AnimatedList組件實現(xiàn)列表元素的一些動態(tài)效果,例如添加元素時的漸現(xiàn)效果,刪除元素逐漸消失的效果等,感興趣的小伙伴可以了解一下
    2022-03-03
  • Android實現(xiàn)帶數(shù)字的圓形進度條(自定義進度條)

    Android實現(xiàn)帶數(shù)字的圓形進度條(自定義進度條)

    在項目開發(fā)中經(jīng)常遇到帶圓形進度條的需求,在GitHub上逛了一圈,發(fā)現(xiàn)沒有,今天小編抽空給大家分享Android實現(xiàn)帶數(shù)字的圓形進度條(自定義進度條),需要的朋友參考下
    2017-02-02
  • Android4.4 WebAPI實現(xiàn)拍照上傳功能

    Android4.4 WebAPI實現(xiàn)拍照上傳功能

    這篇文章主要介紹了Android4.4 WebAPI實現(xiàn)拍照上傳功能,本文給出4.4版本后拍照上傳的具體實現(xiàn)方法,感興趣的小伙伴們可以參考一下
    2016-07-07

最新評論

万源市| 靖远县| 大厂| 扬州市| 寻乌县| 托克逊县| 郎溪县| 漳平市| 平远县| 黄骅市| 临清市| 中卫市| 康马县| 内江市| 司法| 榆林市| 青铜峡市| 白水县| 青川县| 古蔺县| 清远市| 玉山县| 紫阳县| 九寨沟县| 洪洞县| 达尔| 寿光市| 麻江县| 惠州市| 闽侯县| 璧山县| 桐乡市| 榕江县| 保亭| 西平县| 托克托县| 阿图什市| 武邑县| 东莞市| 汉阴县| 喀什市|