程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> AddressSanitizier(ASAN)

AddressSanitizier(ASAN)

編輯:關於C語言
 

Address-Sanitizier(ASAN)是Google開發的一款用於檢查C++內存錯誤的工具,類似於Valgrind。與Valgrind不同的是,使用ASAN檢查內存,需要對應用程序進行重新編譯。在編譯階段,需要將一些內存操作函數替換成ASAN定義和實現的函數,例如malloc, free, memcpy等等, LLVM 3.1和GCC 4.8以後,已經集成了ASAN。在其他平台上只需要添加編譯選項-fsanitize=address然後優化選項在-O1以及以上即可。目前越來越多的程序都已經開始支持ASAN了,例如chromium, firefox等等。

在Android 4.2以後已經集成了ASAN。源碼位於external/compiler-rt/lib/asan。只有在eng版本中,ASAN才會被編譯出來。如果要使用ASAN測試Android的動態庫或者可執行程序,需要在Android.mk中添加LOCAL_ADDRESS_SANITIZER := true, 編譯過程中有可能會有很多報錯,但是這些報錯都跟頭文件包含相關,ASAN會對頭文件包含造成影響,稍微修改頭文件包含以及定義即可。ASAN會編譯出libasan_preload.so和asanwrapper。有2中方式用來運行測試Android應用的內存。一種就是使用asanwrapper /system/bin/xxx --options。但是不是所有的Android程序都可以使用asanwrapper來啟動。但是從asanwrapper.cc

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string>
5
6 void usage(const char* me) {
7 static const char* usage_s = "Usage:\n"
8 " %s /system/bin/app_process <args>\n"
9 "or, better:\n"
10 " setprop wrap.<nicename> %s\n";
11 fprintf(stderr, usage_s, me, me);
12 exit(1);
13 }
14
15 void env_prepend(const char* name, const char* value, const char* delim) {
16 const char* value_old = getenv(name);
17 std::string value_new = value;
18 if (value_old) {
19 value_new += delim;
20 value_new += value_old;
21 }
22 setenv(name, value_new.c_str(), 1);
23 }
24
25 int main(int argc, char** argv) {
26 if (argc < 2) {
27 usage(argv[0]);
28 }
29 char** args = new char*[argc];
30 // If we are wrapping app_process, replace it with app_process_asan.
31 // TODO(eugenis): rewrite to <dirname>/asan/<basename>, if exists?
32 if (strcmp(argv[1], "/system/bin/app_process") == 0) {
33 args[0] = (char*)"/system/bin/app_process_asan";
34 } else {
35 args[0] = argv[1];
36 }
37
38 for (int i = 1; i < argc - 1; ++i)
39 args[i] = argv[i + 1];
40 args[argc - 1] = 0;
41
42 env_prepend("ASAN_OPTIONS", "debug=1,verbosity=1", ",");
43 env_prepend("LD_LIBRARY_PATH", "/system/lib/asan", ":");
44 env_prepend("LD_PRELOAD", "/system/lib/libasan_preload.so", ":");
45
46 printf("ASAN_OPTIONS: %s\n", getenv("ASAN_OPTIONS"));
47 printf("LD_LIBRARY_PATH: %s\n", getenv("LD_LIBRARY_PATH"));
48 printf("LD_PRELOAD: %s\n", getenv("LD_PRELOAD"));
49
50 execv(args[0], args);
51 }

通過這段源碼,你可以發現,asanwrapper.cc制作了一件事情,就是讓libasanpreload.so程序運行的任何被執行之前,被load到進程中。所以,使用ASAN測試Android APK的應用,只需要在app\process Android.mk中添加ASAN編譯選項LOCAL_ADDRESS_SANITIZER := true,然後使用asan_device_setup.sh來啟動設備。這裡也有一份官方的ASAN android使用和配置文檔,但是該使用方法比較陳舊。
 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved