在应用程序中输出函数调用栈
来源:互联网 发布:跑鞋矩阵2017 编辑:程序博客网 时间:2024/05/22 03:48
在内核中,我们可以使用dump_stack()函数来方便的输出函数调用栈。这给了我们很大的便利-无论是理解内核还是调试内核。但是在应用程序中我们该如何输出函数调用栈呢? Linux下我们可以使用下面的函数。
// 获取将backstrace信息,将地址存到buffer中。
// 参数size指定buffer的最大值,返回值则是backstrace的实际大小
int backtrace (void **buffer, int size)
// 根据buffer指定的地址,返回符号信息。参数size指定返回符号信息的大小
char ** backtrace_symbols (void *const *buffer, int size)
// 类似backtrace_symbols()函数,但是不需要malloc空间来存放符号信息,
// 而是将结果写到文件描述符fd所代表的文件中
void backtrace_symbols_fd (void *const *buffer, int size, int fd)
使用函数backtrace_symbols()或者backtrace_symbols_fd()时,需要用-rdynamic编译才能得到正确的符号名,否则只能得到偏移地址。
下面的示例代码应用了backtrace()和backtrace_symbols()函数来打印backtrace的信息:
#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[i]);
free (strings);
}
/* A dummy function to make the backtrace more interesting. */
void dummy_function (void)
{
print_trace ();
}
int main (void)
{
dummy_function ();
return 0;
}
编译运行的结果如下: # gcc bt.c -rdynamic -o bt
# ./bt
Obtained 5 stack frames.
./bt(print_trace+0x14) [0x80486e4]
./bt(dummy_function+0xb) [0x8048765]
./bt(main+0x15) [0x804877c]
/lib/tls/libc.so.6(__libc_start_main+0xe4) [0x42015574]
./bt(backtrace_symbols+0x31) [0x8048641]
- 在应用程序中输出函数调用栈
- 在Linux程序中输出函数调用栈
- 在Linux程序中输出函数调用栈
- 在linux中 应用程序如何调用模块内的函数
- 在linux中 应用程序如何调用模块内的函数
- 在linux中应用程序如何调用模块内的函数
- 在linux中 应用程序如何调用模块内的函数
- 在linux中应用程序如何调用模块内的函数
- 在应用程序中调用Oracle存储过程和存储函数
- 在网页中调用应用程序
- 在网页中调用应用程序
- 在一个应用程序中调用另一个应用程序
- 从 GUI 应用程序中调用 CRT 输出例程(在非console程序中查看printf输出)
- 输出 函数调用栈
- oracle存储函数之在应用程序中使用存储函数输出指定用户的基本信息
- 在linux中打印函数调用栈
- 如何在应用程序中调用帮助文件?
- 在网页中调用本地的应用程序
- 顺序串的插入操作,在pos位置后
- Symbian下tinyXML的内存泄露问题
- 查看Apache 连接数
- 有关数据库存储过程编写的经验总结
- 删除递增线性表中值大于min且小于max的元素
- 在应用程序中输出函数调用栈
- SQL Server 2005/2008 锁和阻塞的监控
- 比较购物网站列表
- 从la中删除字第i个元素起共len个元素后,将他们插入到表lb中第j个元素之前
- 列出目录下的文件
- 利用队列实现杨辉三角的打印
- BSD 超精簡版PF使用手冊
- J2EE学习者值得研究的开源项目
- 实例制作:右下角弹出类似QQ或MSN消息提示