1.添加頭文件
復制代碼 代碼如下:
#include <utils/Log.h>
//或者
#include <cutils/Log.h>
這個時候可以使用ALOGE/ALOGI/ALOGW 等方法打印出log
不過有些地方不能這麼使用,因為依賴libutils libctuils庫
在mk文件見添加如下依賴編譯即可
復制代碼 代碼如下:
#LOCAL_MODULE := ... ...
#base_intermediates := $(call local-intermediates-dir) //該行之下添加,這個貌似是查找依賴文件
LOCAL_SHARED_LIBRARIES += \
libutils libcutils
... ...
include $(BUILD_SHARED_LIBRARY) //該行之上,這時候是開始編譯
2.通常的堆棧
復制代碼 代碼如下:
android::CallStack stack;
stack.update(1);
stack.dump("");
這個需要加個頭文件,不過要特別注意一個問題,這個頭必須加在所有頭的末尾,不然用不了滴,尤其是看android源碼裡webkit的時候。需要加的頭文件如下:
復制代碼 代碼如下:
#include <utils/CallStack.h>
今天有事,後續補全,如果大家有更好的,或者特殊的情況,歡迎推薦
3.C++另類堆棧
這個方法是可文件控制的。通過對android設備中的文件讀寫,然後空指針賦值,這樣就可以達到文件控制的目的
該方法好處只要是C、C++文件均可添加此log,無依賴,便捷!也有個不好處,log只能運行到你添加的地方,因為崩庫了,後面的無法運行了。
實現代碼如下:
復制代碼 代碼如下:
FILE *fp = NULL; //需要注意
fp = fopen("data/test", "r");
if(NULL == fp)
{
return false; //需要返回值時使用
} esle {
fclose(fp);
int *fp = NULL;
*fp = 100; //空指針賦值出錯,小樣就它錯了
return false; //需要返回值時使用
}
一般崩庫了是看不到堆棧的,我們可以通過反匯編來查看具體的堆棧。
在android裡編譯出的庫有兩套:一套無符號的,是查看不了的,另一套是有符號的,我們查看的就是這套,
有符號的編譯出來後是在路徑(\out\target\product\generic\symbols\system\lib)下
android中自帶有arm的反匯編工具,在設置後編譯環境後就可以正常使用了,命令如下:
復制代碼 代碼如下:
arm-eabi-addr2line -f -e **.so 地址1 地址2 ... ...