linux中追踪函数backtrace调用堆栈

From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2388.html

一般察看函数运行时堆栈的方法是使用GDB之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。

在头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈

Function: int backtrace(void **buffer,int size)

该函数用与获取当前线程的调用堆栈,获取的信息将会被存放在buffer中,它是一个指针列表。参数 size 用来指定buffer中可以保存多少个void* 元素。函数返回值是实际获取的指针个数,最大不超过size大小

在buffer中的指针实际是从堆栈中获取的返回地址,每一个堆栈框架有一个返回地址

注意某些编译器的优化选项对获取正确的调用堆栈有干扰,另外内联函数没有堆栈框架;删除框架指针也会使无法正确解析堆栈内容

Function: char ** backtrace_symbols (void *const *buffer, int size)

backtrace_symbols将从backtrace函数获取的信息转化为一个字符串数组. 参数buffer应该是从backtrace函数获取的数组指针,size是该数组中的元素个数(backtrace的返回值)   
   
函数返回值是一个指向字符串数组的指针,它的大小同buffer相同.每个字符串包含了一个相对于buffer中对应元素的可打印信息.它包括函数名,函数的偏移地址,和实际的返回地址

现在,只有使用ELF二进制格式的程序和苦衷才能获取函数名称和偏移地址.在其他系统,只有16进制的返回地址能被获取.另外,你可能需要传递相应的标志给链接器,以能支持函数名功能(比如,在使用GNU ld的系统中,你需要传递(-rdynamic))

该函数的返回值是通过malloc函数申请的空间,因此调用这必须使用free函数来释放指针.

注意:如果不能为字符串获取足够的空间函数的返回值将会为NULL

Function:void backtrace_symbols_fd (void *const *buffer, int size, int fd)

backtrace_symbols_fd与backtrace_symbols 函数具有相同的功能,不同的是它不会给调用者返回字符串数组,而是将结果写入文件描述符为fd的文件中,每个函数对应一行.它不需要调用malloc函数,因此适用于有可能调用该函数会失败的情况

下面的例子显示了这三个函数的用法

#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>

/* Obtain a backtrace and print it to stdout. */
void
print_trace (void)
{
void *array[10];
size_t size;
char **strings;
size_t i;

size = backtrace (array, 10);
strings = backtrace_symbols (array, size);

printf ("Obtained %zd stack frames./n", size);

for (i = 0; i < size; i++)
     printf ("%s/n", strings);

free (strings);
}

/* A dummy function to make the backtrace more interesting. */
void
dummy_function (void)
{
print_trace ();
}

int
main (void)
{
dummy_function ();
return 0;
}

备注:void *const *buffer -- buffer指向char类型的常量指针的指针(很是拗口)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB 中RMSE和MAPE的计算方法

RMSE&#xff1a;均方根误差 matlab计算方法&#xff1a; rmse sqrt(mean((YPred-Obverval).^2)); MAPE&#xff1a;平均百分比误差 matlab计算方法&#xff1a; meap mean(abs((observed - predicted)./observed))*100;

Linux SPI总线和设备驱动架构

http://blog.csdn.net/droidphone/article/details/24353293

[react] React15和16别支持IE几以上?

[react] React15和16别支持IE几以上&#xff1f; React15 版本不直接支持IE8 浏览器的&#xff0c;官方文档中说React16 中依赖于集合类型Map 和 Set 因此不再支持IE 11 以下的浏览器&#xff0c;如果想要支持&#xff0c;需要使用全局的 polyfill 个人简介 我是歌谣&#x…

ubuntu11.04正式版下载地址

ubuntu11.04正式版下载地址&#xff1a; 下載點列表&#xff1a; http://ftp.cs.pu.edu.tw/Linux/Ubuntu/ubuntu-cd/11.04/ubuntu-11.04-desktop-amd64.iso http://ftp.cse.yzu.edu.tw/pub/Linux/Ubuntu/ubuntu-cd/11.04/ubuntu-11.04-desktop-amd64.iso http://ftp.cs.pu.edu.…

hdu 3074 线段树 OR 树状数组

比较基础的线段树&#xff0c;1A。 线段树&#xff1a; 1 #include <iostream>2 #include <cstring>3 #include <cstdio>4 using namespace std;5 6 typedef long long ll;7 const int N 50001;8 const int MOD 1000000007;9 int a[N];10 11 struct Node12…

掌握shell编程中数组的常见用法及示例

From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2386.html 给大家分享下数组的用法小例子&#xff0c;希望能给大家一点帮助。其实SHELL的数组很简单&#xff0c;好用。我们学习都应该遵循简单、易用的原则。 shell编程中数组的简单用法及示例 新版本的B…

QT tr与Qstring的差别

在论坛中漂&#xff0c;经常遇到有人遇到tr相关的问题。用tr的有两类人&#xff1a; (1)因为发现中文老出问题&#xff0c;然后搜索&#xff0c;发现很多人用tr&#xff0c;于是他也开始用tr(2)另一类人&#xff0c;确实是出于国际化的需要&#xff0c;将需要在界面上显示的文…

printf的扩展

#define printf(format , ...) printf("FILE[%s] LINE[%d]" format , __FILE__ , __LINE__ , ##__VA_ARGS__)这个宏应用好几个技巧&#xff1a;1、使用printf宏&#xff0c;和原来的printf相同。这样我们不需要修改源码&#xff0c;直接替换原来的printf的函数。2、…

[react] contextType是什么?它有什么用?

[react] contextType是什么&#xff1f;它有什么用&#xff1f; 定义当前组件要使用哪一个context const MyContext React.createContext(defaultValue);class MyClass extends React.Component {componentDidMount() {let value this.context;/* perform a side-effect at…

shell 基本知识

shell--脚本基础知识 ****shell 脚本基础知识**** 一、基本脚本编译 知识内容&#xff1a; # 构建脚本 # 将命令串联起来 # 存储变量 # 数学计算 # 重定向输出 # 检查代码shell不像高级语言需要编译后执行&#xff0c;而是直接处理每一条命令&#xff0c;可以将多条命令连接起来…

Lombok(1.14.8) - @Log

Log Logs&#xff0c;生成一个日志对象。 package com.huey.lombok;import lombok.extern.java.Log;Log public class LogExample {public static void main(String[] args) {log.info("This is an info message."); }} 除了&#xff0c;Log还有其他annotatio…

让LwIP拥有PING其他设备的能力

LwIP是个很不错的协议栈&#xff0c;但是由于其体积过于小巧&#xff0c;使其只能支持ICMP的ECHO类型。 因为在“icmp.c”中的“void icmp_input(struct pbuf *p, struct netif *inp)”函数里有个很长的switch case语句&#xff08;大约80行的位置&#xff09;。 而这个语句只…

[react] 在React怎么使用Context?

[react] 在React怎么使用Context&#xff1f; context : Context提供了一种方式&#xff0c;能够让数据在组件树中传递&#xff0c;而不必一级一级手动传递。 API : createContext(defaultValue?)。 使用方法&#xff1a; 首先要引入createContext import React, { Component…

H.264详解

From: http://netliuwei.blog.163.com/blog/static/93642191201111721931583/ H.264 H.264&#xff0c;同时也是MPEG-4第十部分&#xff0c;是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&…

使用UDP

基本UDP客户端 #!/usr/bin/env python # UDP Example - Chapter 2 import socket, sys, time host sys.argv[1] textport sys.argv[2] s socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: port int(textport) except ValueError: # That didnt work. Look it up in…

QT中的MessageBox设置自动关闭退出

一、概述 由于弹出的MessageBox需要手动操作&#xff0c;点击相关操作程序才会进一步执行&#xff0c;所以有时程序使用了MessageBox会阻塞相关功能代码执行。例如&#xff0c;在串口编程中&#xff0c;接收到数据或某项配置成功后弹出一个MessageBox&#xff0c;由于没有及时…

(剑指Offer)面试题54:表示数值的字符串

题目&#xff1a; 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&#xff0c;字符串"100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14"…

Loopback Address

ping 127.0.0.1 是你本地的回环地址&#xff01; 实际上只要是127.0.0.1到127.255.255.255都是回环地址&#xff01;都是可以PING检查的&#xff01; 它能ping通&#xff0c;说明你的TCP/IP协议栈没问题&#xff01;如果有问题&#xff0c;你就得检查TCP/IP协议栈&#xff0c;或…

[react] Consumer向上找不到Provider的时候怎么办?

[react] Consumer向上找不到Provider的时候怎么办&#xff1f; 当consumer向上层找不到provider时&#xff0c;此时就会取创建context时传给createContext的那个值&#xff0c;也就是当前context对象的默认值&#xff0c;在定义provider时的value中的值不是默认值&#xff0c;…

VSCode中配置prettier和ESLint

文章目录 了解ESLint和Prettier的作用prettier配置ESLint配置常见问答ESLint 和Prettier 有什么区别&#xff1f;为什么我应该同时使用ESLint 和Prettier&#xff1f;在使用ESLint 和Prettier 时&#xff0c;有可能出现它们之间的规则冲突吗&#xff1f;我已经在项目中使用了ES…