(1)Java中添加
Java中添加callstack常见以下几种方式。
import android.util.Log;
//(1)
Exception e = new Exception("this is a log");
e.printStackTrace();
//(2)
Thread.currentThread().getStackTrace();
//(3)
Log.e("dump_test" , Log.getStackTraceString(new Throwable()));
(2)C++中添加
(A)Mtk Camera Hal中有自定义的stack
//vendor/mediatek/proprietary/hardware/mtkcam/include/mtkcam/utils/std
//Misc.h
namespace NSCam {
namespace Utils {
void dumpCallStack(char const* prefix = 0);
bool saveBufToFile(char const*const fname, unsigned char*const buf, unsigned int const size);
unsigned int loadFileToBuf(char const*const fname, unsigned char*const buf, unsigned int const capacity);
}
}
//vendor/mediatek/proprietary/hardware/mtkcam/utils/std
//Misc.cpp
//可使用如下方式进行使用
NSCam::Utils::dumpCallStack(__FUNCTION__);
NSCam::Utils::saveBufToFile(filename,
(unsigned char*)jpg.mOutputJpegBuffer->getBufVA(0),
jpg.mOutputJpegBuffer->getBufSizeInBytes(0));
//使用示例
#include <mtkcam/utils/std/Misc.h>
using namespace NSCam;
using namespace android;
using namespace std;
NSCam::Utils::dumpCallStack(__FUNCTION__);
打印示例
11-15 15:37:23.082 748 6053 I MtkCam/Utils/encodeMainJpeg: pid(748) tid(6053) Cam@Jpeg
11-15 15:37:23.082 748 6053 I MtkCam/Utils/encodeMainJpeg: #00 pc 0000000000003040 /vendor/lib64/libladder.so (UnwindCurThreadBT+120)
11-15 15:37:23.082 748 6053 I MtkCam/Utils/encodeMainJpeg: #01 pc 000000000000e4c4 /vendor/lib64/libmtkcam_stdutils.so (NSCam::Utils::dumpCallStack(char const*)+52)
11-15 15:37:23.082 748 6053 I MtkCam/Utils/encodeMainJpeg: #02 pc 00000000001702ec /vendor/lib64/libmtkcam_hwnode.so (JpegNodeImp::encodeMainJpeg(android::sp<encode_frame>&)+44)
11-15 15:37:23.082 748 6053 I MtkCam/Utils/encodeMainJpeg: #03 pc 000000000016ceb4 /vendor/lib64/libmtkcam_hwnode.so (onProcessRequest(JpegNodeImp&, Request&)+788)
11-15 15:37:23.082 748 6053 I MtkCam/Utils/encodeMainJpeg: #04 pc 000000000017f064 /vendor/lib64/libmtkcam_hwnode.so (void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(JpegNodeImp&, Request&), std::__1::reference_wrapper<JpegNodeImp>, std::__1::reference_wrapper<Request> > >(void*)+44)
11-15 15:37:23.082 748 6053 I MtkCam/Utils/encodeMainJpeg: #05 pc 00000000000b0bd8 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
11-15 15:37:23.082 748 6053 I MtkCam/Utils/encodeMainJpeg: #06 pc 00000000000505d0 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
(B)C++中通用添加
(a)在Android.bp / Android.mk 中添加 libutilscallstack
//Android.bp
shared_libs: [
"libutilscallstack",
]
//Android.mk
LOCAL_SHARED_LIBRARIES:= libutilscallstack
//或
LOCAL_JNI_SHARED_LIBRARIES := libutilscallstack
(b)在C++源码文件预编译 include 中添加
#include <utils/CallStack.h>
(c)添加代码实现
#include <utils/CallStack.h>
using android::CallStack;
CallStack stack;
stack.update();
stack.log(__FUNCTION__);
(d)系统库的源码位置
//system/core/libutils/include/utils/CallStack.h
class CallStack {
public:
CallStack();
~CallStack();
void clear() {
mFrameLines.clear(); }
void update(int32_t ignoreDepth = 1, pid_t tid = BACKTRACE_CURRENT_THREAD);
void log(const char* logtag,
android_LogPriority priority = ANDROID_LOG_DEBUG,
const char* prefix = nullptr) const;
void dump(int fd, int indent = 0, const char* prefix = nullptr) const;
String8 toString(const char* prefix = nullptr) const;
void print(Printer& printer) const;
}
//system/core/libutils/CallStack.cpp
(e)打印示例
11-15 15:37:23.394 748 6053 D encodeMainJpeg: #00 pc 00000000001703d4 /vendor/lib64/libmtkcam_hwnode.so (JpegNodeImp::encodeMainJpeg(android::sp<encode_frame>&)+276)
11-15 15:37:23.394 748 6053 D encodeMainJpeg: #01 pc 000000000016ceb4 /vendor/lib64/libmtkcam_hwnode.so (onProcessRequest(JpegNodeImp&, Request&)+788)
11-15 15:37:23.394 748 6053 D encodeMainJpeg: #02 pc 000000000017f064 /vendor/lib64/libmtkcam_hwnode.so (void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void (*)(JpegNodeImp&, Request&), std::__1::reference_wrapper<JpegNodeImp>, std::__1::reference_wrapper<Request> > >(void*)+44)
11-15 15:37:23.394 748 6053 D encodeMainJpeg: #03 pc 00000000000b0bd8 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
11-15 15:37:23.394 748 6053 D encodeMainJpeg: #04 pc 00000000000505d0 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
(3)Kernel中添加
Kernel中较简单,直接有现成的函数可以使用
dump_stack() //这个函数打出当前堆栈和函数调用backtrace后接着运行
WARN_ON(x) //这个函数跟dump_stack很像,如果条件满足了就把stack打出来
//WARN_ON(1);
文章浏览阅读4.2k次。企业管理器--管理--SQL Server代理--右键作业--新建作业--“常规”项中输入作业名称--“步骤”项--新建--“步骤名”中输入步骤名--“类型”中选择“Transact-SQL 脚本(TSQL)”--“数据库”选择执行命令的数据库--“命令”中输入要执行的语句:INSERT / DELETE ...--确定--“调度”项--_sql 2000调度时间
文章浏览阅读5.3k次,点赞2次,收藏4次。1.场景:今天用adb命令安装测试安装包,发现报错:Failure [INSTALL_FAILED_ALREADY_EXISTS]2.问题分析:前天有在手机上安装过这个测试包,也卸载过了,但是依然报错,所以考虑是包还在手机上,用命令:adb shell pm list packages 查看此时连接手机里面的所有安装包,找到这个包名,然后执行命令:adb uninstall 包名,进..._install_failed_already_exists
文章浏览阅读81次。最近公司的一个项目里的linux 系统中的oracle 10g数据库,需要把某个表空间里的所有数据都迁移到window 2003的11g里,经过我与dba的交流、测试,决定使用跨平台的表空间传输技术,目前此项任务已经完成,经过测试,没有问题,下面是我为此项任务做的测试,此次是做linux(oracle 10g)对window (oracle 11g)做..._linux表空间对应到windows上
文章浏览阅读1.5k次,点赞4次,收藏15次。线性时不变离散系统可用线性常系数差分方程描述,即∑i=0Naiy(n−i)=∑j=0Mbjx(n−j)\sum_{i=0}^Na_iy(n-i)=\sum_{j=0}^Mb_jx(n-j)∑i=0Naiy(n−i)=∑j=0Mbjx(n−j),其中,y(k)y(k)y(k)为系统的输出序列,x(k)x(k)x(k)为输出序列。将上式两边进行Z变换得到H(z)=Y(z)X(z)=∑j=0Mbjz−j∑i=0Naiz−i=B(z)A(z)H(z)=\frac{Y(z)}{X(z)}=\frac{\sum_matlab怎么表示z域系统函数表达式
文章浏览阅读202次。前言日常开发一直是linux后台 + 控制系统软件开发,感觉每天的黑框甚是无聊啊,遥想界面开发,平时主要用C++,无他,只能QT了,上次使用还是读书时,已经忘得差不多了。好在看了一下QT的基本框架,感觉封装的非常好,如果做了一个简单的Demo测试。本人晚上九点到家,昨天开发到11点多,今天又开发了一会。终于有个雏形了。功能实现完全参考win10 记事本的样子写的,照猫画虎;不知道怎么弄的就百度;实现基本的功能如下:文件,编辑,查找支持快捷键待改善(实在太多了)只是抱着用用的态度,学_qt编辑器太垃圾了
文章浏览阅读324次。列表隔5行加一行线: {dede:list pagesize='50'} target=_blank>[field:title function="cn_substr(@me,48)"/][field:pubdate runphp='yes'] $a="".strftime('%m-%d',@me).""; $b=strftime('%m-%d',@me); $ntime _{dede:field.title function='htmlspecialchars()' /}htmlspecialchars()如何使用
文章浏览阅读669次。题目:_统计模拟及其r实现答案
文章浏览阅读1.8k次。一、基本结构使用modelsim工具,调用Verilog的系统函数,将图像数据读入testbench的memory组。在处理后调用系统函数将数据保存成文件。这些系统函数是不可综合成硬件的,仅用于仿真测试。图像数据需要使用matlab生成,因为普通图片是进行过压缩储存的,需要把图片还原成原始rgb或ycrcb数据流。同理处理完保存的图片原始数据需要用matlab进行处理,转换成可用于显示的图片格..._modelsim可以仿真出函数图像
文章浏览阅读297次。说明:本文主要以Laravel的容器类Container为例做简单说明Composer的自动加载机制。Composer的自动加载机制1、初始化一个composer项目在一个空目录下composer安装Laravel的容器Container包:composer require illuminate/container然后在该目录下新建一个index.php文件,..._composer为了防止类冲突命名composerautoloaderinit+hash
文章浏览阅读3.1k次,点赞3次,收藏24次。一、音频编码调制技术根据编码方式的不同,音频编码技术分为三种:波形编码、参数编码和混合编码。一般来说,波形编码的话音质量高,但编码速率也很高;参数编码的编码速率很低,产生的合成语音的音质不高;混合编码使用参数编码技术和波形编码技术,编码速率和音质介于它们之间。实际应用中,我们通常采用的是脉冲编码调制(即PCM编码)。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码。脉冲编..._音频编码技术知识点总结
文章浏览阅读408次,点赞3次,收藏3次。-_人机工程学界面排布相关定律
文章浏览阅读5.3k次,点赞2次,收藏2次。题目LeetCode 142. 环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为_双指针 链表 环 索引