android 打印java堆棧,Android打印堆棧

java打印堆棧

方法一:異常對象打印堆棧

Exception e = new Exception("this is a log");

e.printStackTrace();

方法二:Log打印獲取異常的堆棧并打印

Log.e(“dump_test”,Log.getStackTraceString(new Throwable()));

C++\C打印堆棧

方法一:linux函數

函數介紹

頭文件:java

#include

函數方法:linux

// 獲取當前的調用棧信息,結果存儲在buffer中,返回值為棧的深度,參數size限制棧的最大深度,即最大取size步的棧信息。

int backtrace(void **buffer, int size);

// 把backtrace獲取的棧信息轉化為字符串,以字符指針數組的形式返回,參數size限定轉換的深度,通常用backtrace調用的返回值。

char **backtrace_symbols(void *const *buffer, int size);

// 它的功能和backtrace_symbols差很少,只不過它不把轉換結果返回給調用方,而是寫入fd指定的文件描述符。

void backtrace_symbols_fd(void *const *buffer, int size, int fd);

編譯選項android

-rdynamic

-g

gcc編譯時加上-rdynamic和-g編譯選項,就能夠看到被調用的函數和地址,以下web

stackstrace begin:

./test3(_Z16print_stacktracev+0x26) [0x4008e5]

./test3(_Z4fun1v+0x13) [0x4008a7]

./test3(_Z4fun2v+0x9) [0x4008b2]

./test3(_Z4fun3v+0x9) [0x4008bd]

./test3(main+0x9) [0x40088d]

/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xff) [0x7fa9558c1eff]

./test3() [0x4007c9]

堆棧轉換

如有一個函數有多個地方被調用,能夠使用addr2line,把調用地址轉換為行數數組

// addr2line -aCfe lib addr

$ addr2line -aCfe 0x4008a7 test3

0x00000000004008a7

fun1()

/home/wuzesheng/work/test/test.cc:20

Android使用編譯選項

在Android中,編譯腳本是Android源碼中已經寫好的,能夠在Android.mk中如下面方式添加編譯選項svg

LOCAL_CFLAGS += -rdynamic -g

linux下使用編譯選項

非Android編譯,使用以下命令函數

gcc test.cc -rdynamic -g -o test3

示例:工具

#include

#include

#include

#include

void

myfunc3(void)

{

int j, nptrs;

#define SIZE 100

void *buffer[100];

char **strings;

nptrs = backtrace(buffer, SIZE);

printf("backtrace() returned %d addresses\n", nptrs);

/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)

would produce similar output to the following: */

strings = backtrace_symbols(buffer, nptrs);

if (strings == NULL) {

perror("backtrace_symbols");

exit(EXIT_FAILURE);

}

for (j = 0; j < nptrs; j++)

printf("%s\n", strings[j]);

free(strings);

}

static void /* "static" means don't export the symbol... */

myfunc2(void)

{

myfunc3();

}

void

myfunc(int ncalls)

{

if (ncalls > 1)

myfunc(ncalls - 1);

else

myfunc2();

}

int

main(int argc, char *argv[])

{

if (argc != 2) {

fprintf(stderr, "%s num-calls\n", argv[0]);

exit(EXIT_FAILURE);

}

myfunc(atoi(argv[1]));

exit(EXIT_SUCCESS);

}

方法二:使用Android工具方法

示例:

C++中測試

<1>.test.cpp

#include

#include

void dumping_callstack(){

android::CallStack stack;

//getpid()和gettid()效果同樣

//stack.update(2,getpid());

//stack.update(2,gettid());

stack.update();

//輸出到printf

stack.dump(1);

//輸出到logcat

stack.log("dump_test");

//能夠設置第二、3個參數

//stack.log("Dumping Stack",ANDROID_LOG_ERROR ,"123 ");

}

void func1(){

dumping_callstack();

}

void func2(){

func1();

}

void func3(){

func2();

}

int main(){

ALOGE("main_test------------------>");

func3();

}

<2>.Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := test.cpp

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := test

LOCAL_SHARED_LIBRARIES += libcutils libutils

include $(BUILD_EXECUTABLE)

C中this

<1>.建立callstack.cpp

#include

extern "C" void dumping_callstack();

void dumping_callstack(){

android::CallStack stack;

stack.update();

stack.log(“dump_test“);

}

<2>.建立callstack.h

void dumping_callstack();

<3>.測試test.c

#include "callstack.h"

static ssize_t out_write(){

dumping_callstack();

}

<4>.Anroid.mk中添加到編譯選項:callstack.cpp及庫

LOCAL_SHARED_LIBRARIES := libcutils libutils

LOCAL_SRC_FILES := callstack.cpp

kernel打印堆棧

#include

printk(KERN_ERR "dump_stack start: %s() %d \n",__FUNCTION__,__LINE__);

dump_stack();

.......

printk(KERN_ERR "dump_stack stop: %s() %d \n",__FUNCTION__,__LINE__);

根據dump stack的log位置加printk()。

注意

java通過實踐測試。

C++\C部分未通過實際完整測試,其中命令都零散的使用過,若參照使用,請根據實際狀況調整,總體思路應該沒錯。實測部分,后面盡可能補上

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397536.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實際算法項目工程上手日志C/C++

#pragma once 為了保證頭文件只被編譯一次&#xff0c;通常放在頭文件的頂部 #define IN #define OUT #define INOUT 這個只在邏輯上起作用&#xff0c; IN 表示輸入參數&#xff0c;指針指向的值不會修改&#xff1b; OUT 表示輸出參數&#xff0c;指針指向的值會修改&a…

Arduino 控制超聲波測距模塊

一.實物圖 二.例子代碼 用到數字2 和3 引腳,還有兩個就是vcc GND兩個陰腳,用模塊連線比較簡單 轉載于:https://www.cnblogs.com/caoguo/p/4785700.html

Linux安裝source-code-pro字體

2019獨角獸企業重金招聘Python工程師標準>>> 1.下載source-code-pro字體 從GitHub下載 https://github.com/adobe-fonts/source-code-pro/releases 2.解壓文件&#xff0c;將OTF格式的文件夾重新命名一下&#xff0c;這里我命名為source-code-pro&#xff0c;然后將…

dft對稱性 matlab實驗,數字信號處理實驗指導書(審)

(0???2?)上對X(ej?)均勻采樣得到?X(k)?X(ej?)??2?k/N??n???x(n)e?j2?kn/N 0?k?N?1可以看到X(k)也是頻域上的有限長序列&#xff0c;長度為N。序列X(k)稱為序列x(n)的N點DFT。N稱為DFT變換區間長度。 通常表示WN?e?j2?/N可將定義式表示為?X(k)??x(n)…

PI

并不是所有東西都可以套PI的&#xff0c;只有滿足上述這類的數學關系才可以。 轉速經過PI調節得到電流也是有原因的。從下圖中可以發現&#xff0c;轉速 k*Iq/s&#xff0c;s是拉普拉斯算子&#xff0c;所以也是滿足積分&#xff0c;比例關系的。 轉載于:https://www.cnblogs.…

AOP之AspectJ簡單使用

為什么80%的碼農都做不了架構師&#xff1f;>>> 參考文章&#xff1a; 使用AspectJ在Android中實現Aop 深入理解Android之AOP自動打印日志主要知識點&#xff1a; 主要是JPoint、pointcuts、advice以及他們之間的關系可以通過aj文件、或AspectJ注解的Java文件實現A…

matlab drawnow連成曲線,precision recall曲線Matlab實現

在用哈希進行檢索時&#xff0c;常會用到precision recall曲線對其性能進行定量評價。precision recall的定義在信息檢索評價指標中已做了詳細說明&#xff0c;這里再記錄一下precision recall的具體實現。precision recall曲線matlab一般使用的都是下面的版本&#xff1a;func…

trap

http://blog.csdn.net/elbort/article/details/8525599 http://mywiki.wooledge.org/SignalTrap轉載于:https://www.cnblogs.com/flowjacky/p/4785723.html

WinSCP實現Ubuntu與 Windows 文件共享方法

2019獨角獸企業重金招聘Python工程師標準>>> WinSCP是一個Windows環境下使用SSH的開源圖形化SFTP客戶端。同時支持SCP協議。它的主要功能就是在本地與遠程計算機間安全的復制文件。WinSCP綠色中文版 一款基于SSH安全高效的FTP上傳軟件。WinSCP 可以執行所有基本的文…

緩存機制

緩存 緩存就是數據交換的緩沖區&#xff08;稱作Cache&#xff09; 客戶端&#xff1a;緩存&#xff08;expires&#xff09;、deflate壓縮 緩存服務器&#xff1a;CDN/cache緩存靜態內容如&#xff1a;html、jpg、gif、js等 靜態web服務器&#xff1a;Apache/nginx靜態服務器提…

Shell學習總結

Shell 是什么&#xff1f; Shell 是一個用C語言編寫的程序&#xff0c;它是用戶使用Linux的橋梁。Shell既是一種命令語言&#xff0c;又是一種程序設計語言。 Shell 是指一種應用程序&#xff0c;這個應用程序提供了一個界面&#xff0c;用戶通過這個界面訪問操作系統內核的服務…

java有幾個關鍵字,Java多線程常用的幾個關鍵字

Java多線程常用的幾個關鍵字二、volatile作用&#xff1a;volatile關鍵字的作用是&#xff1a;使變量在多個線程間可見(具有可見性)&#xff0c;但是僅靠volatile是不能保證線程的安全性&#xff0c;volatile關鍵字不具備synchronized關鍵字的原子性。Demo1:package com.ietree…

PHP獲取QQ等級,php仿QQ等級太陽顯示函數

開頭先引述下QQ等級的算法&#xff1a;設當前等級為N&#xff0c;達到當前等級最少需要的活躍天數為D&#xff0c;當前活躍天數為Dc&#xff0c;升級剩余天數為Dr&#xff0c;則&#xff1a;從而推出:好了&#xff0c;引述完成&#xff0c;懶得寫字了&#xff0c;貼出代碼&…

Bugfree實用心得_轉

轉自&#xff1a;http://blog.csdn.net/benkaoya/article/details/8719257 本博下有許多實用技巧 1. 什么是問題跟蹤系統 問題跟蹤系統&#xff08;Issue Tracking System&#xff09;是專門用于記錄、跟蹤和管理各類問題的軟件。 問題跟蹤系統出現于上世紀80年代&#xff0c;…

【qxbt day1】 P2367 語文成績

今天學了 差分********* 很明白 然后 配合著luogu上的題寫一下吧 裸的差分 當時一直打暴力60分 交了十幾次 今天才知道 查詢修改什么的是差分 直接看題把 輸入輸出格式輸入格式&#xff1a; 第一行有兩個整數n&#xff0c;p&#xff0c;代表學生數與增加分數的次…

python會什么比c慢

眾所周知&#xff0c;python執行速度比c慢。原因為何&#xff1f; 先來看下面這張圖&#xff1a; python的傳統運行執行模式&#xff1a;錄入的源代碼轉換為字節碼&#xff0c;之后字節碼在python虛擬機中運行。代碼自動被編譯&#xff0c;之后再解釋成機器碼在CPU中執行。 補充…

多維動歸第一題

https://www.luogu.org/problemnew/show/P1508 好了這題就是較為簡單的坐標類DP&#xff08;感覺&#xff09;&#xff0c;總之是一個二維的區域&#xff0c;需要一步一步地向可前進方向dp&#xff0c;而倒退過來&#xff0c;就是每一個地方取之前的地方里最多的一個進行選擇&a…

Json字符串處理

2019獨角獸企業重金招聘Python工程師標準>>> pom.xml <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.7</version> </dependency> 編寫GsonUtils類 // // Source c…

用腳本控制虛擬機

#############用腳本控制虛擬機給file.sh 一個權限chmod x file.sh轉載于:https://blog.51cto.com/forever8/1863587

HDU 5288

//枚舉因子&#xff0c;查找和i最近的左右是i因子的點即可。#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define LL long long using namespace std;const int MAX100010; const LL mod1e97; int l_next[10010];…