在linux代码中打印函数调用的堆栈的方法

之前一直有这样的需求,当时问到,也没搜到方法,现在竟然既问到了,也搜到了,哎,世事真是不能强求啊!

Linux内核调试中,经常用到的打印函数调用堆栈的方法非常简单,只需在需要查看堆栈的函数中加入:

dump_stack();或 __backtrace();即可。

dump_stack()在~/kernel/ lib/Dump_stack.c中定义

void dump_stack(void)
{
 printk(KERN_NOTICE
  "This architecture does not implement dump_stack()/n");
}

__backtrace()的定义在~/kernel/arch/arm/lib/backtrace.S中

ENTRY(__backtrace)
  mov r1, #0x10
  mov r0, fp

在linux应用程序调试中,使用的方法是:

backtrace
backtrace_symbols

可以在函数中加入如下代码:

void *bt[20]; 
 char **strings; 
 size_t sz;

sz = backtrace(bt, 20); 
 strings = backtrace_symbols(bt, sz);
        for(i = 0; i < sz; ++i)
                fprintf(stderr, "%s/n", strings[i]);

还有一个帖子总结了在各种平台和语言中打印backtrace的方法:

http://blog.csdn.net/csucrab/archive/2010/06/17/5675686.aspx

时间: 2024-08-02 19:22:33

在linux代码中打印函数调用的堆栈的方法的相关文章

Linux系统中修改/etc/profile文件的方法

在Linux系统中etc/profile文件一般是不能更改的,想要更改etc/profile文件就要用一些特殊的技巧进行Linux文件修改.本文就来介绍一下Linux系统中修改/etc/profile文件的方法: etc/profile文件是只读的,直接用vi或gedit打开修改后是无法保存的.要修改profile,需要取得root权限,(使用gedit编辑) $sudo gedit /etc/profile 或者 $sudo -s $gedit /etc/profile 这样打开profile

在ASP程序中打印Excel报表的新方法

目前,B/S模式(浏览器/服务器模式)成为企业网上首选的计算模式.由于B/S模式的特殊性,在C/S下相对较易实现的Excel报表打印功能在B/S下却成为一个难点.本人通过研究写了一个基于ASP程序的打印Excel报表的程序.本程序的特点是无须任何组件. Print.asp ------------------------------------------------ <html><title>打印Excel报表</title> <% '控制脚本语言 respon

获取屏幕高宽,在代码中设置控件大小的方法

获取屏幕高宽的方法: 1 import android.view.Display; 2 import android.view.WindowManager; 3 WindowManager windowManager = getWindowManager(); 4 Display display = windowManager.getDefaultDisplay(); 5 if(display.getWidth()==480 && display.getHeight()== 272 ||

JNI的native代码中打印日志到eclipse的logcat中

1 添加ndk对log支持若需要添加ndk对log的支持,只需要通过以下2步即可实现. 1.1 修改Android.mk如生成的库文件是“.so文件”,则在Android.mk中添加如下内容:LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog如生成的库文件是“.a文件”,则在Android.mk中添加如下内容:LOCAL_LDLIBS:=-llog 1.2 在.c或.cpp文件中引用log头文件添加如下内容:// 引入log头文件#include  <android

转 在Linux内核中打印日志时间戳

在编译Linux内核,配置时:make menuconfig ---> Kernel hacking --> printk and dmesg options --> show timing information on printks 当选中这个选项后,启动内核,会在日志信息前面加上时间戳. 从下面的输出可以看出,时间精确到微秒(us). 如下: ----------------------------------------------------------------------

存储linux RAID6中raid信息丢失数据恢复解决方法

数据恢复故障描述: 原存储为12块2T硬盘组成的Linux RAID6,文件系统均为EXT3,此存储上划有3个LUN,每个均为6TB大小,某天在RAID失效后,维护人员为了抢救数据,对此失效的存储重进行分配RAID,并进行了初始化.初始化进行很长时间后,维护人员察觉到情况有异,便强制停止初始化,但初始化已达到 50%以上.数据部分已被不可逆的破坏.数据恢复故障分析:故障的起因仅仅是RAID失效,维护人员随后的抢救数据过程中用11块硬盘进行重分配RAID5,并进行长时间的初始化,这对原始数据是不可

vscode中检测代码中的空白行并去除的方法【转】

按下ctrl+h键进行正则匹配:^\s*(?=\r?$)\n 然后直接替换,再看代码发现空行已经不见了. 原文地址:https://www.cnblogs.com/micenote/p/9414474.html

java中打印数组的几种方法

<span style="white-space:pre"> </span>Arrays.toString(arr) for(int n: arr) System.out.println(n+", "); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ", "); } System.out.println(Arrays.asList(

代码中使用StoryBoard和DoubleAnimation的方法

TranslateTransformを対象に.DoubleAnimation型のアニメーションを使用して.TranslateTransform.Xプロパティを ”-1 * Imageコントロールの幅” → 0 に変化させます. -- MainWindow.xaml.cs -- Storyboard storyboard = new Storyboard();DoubleAnimation doubleAnimation = new DoubleAnimation();doubleAnimatio