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.mzph.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];…