荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (UNIX+C+XML+?? 傻了?), 信区: Linux
标  题: Re: accessing call stack and symbol table(转
发信站: 荔园晨风BBS站 (Tue Apr 16 20:54:27 2002), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@apue.dhs.org 所发表 】
发信人: avatar (死书呆), 信区: APUE
标  题: Re: accessing call stack and symbol table
发信站: UNIX编程 (2002年04月08日19:33:52 星期一), 站内信件


【 在 scz (小四★跨越封锁线⊙) 的大作中提到: 】
: 【 在 knightmare (梦醒时分) 的大作中提到: 】
: : 这样啊?那算什么东东啊?:(
: 看我整理的那份文档中的
: <<Solaris中如何获取一个C程序的调用栈回溯>>
: 里面有更好的讨论,不限于Solaris系统

libc里有用于debug的函数,挺好用的。
#include <execinfo.h>

int backtrace(void **buffer, int size);
char **backtrace_symbols(void *const *buffer, int size);

编译时要加dynamic-???选项,不知道干什么的。
我一般不加这个选项,然后程序中用backtrace,再addr2line转换成符号。

在 GNU C Library Reference Manual中有例子

Edition 0.09 DRAFT for version 2.2 Beta
Page 827

#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;
}
--
※ 来源:·UNIX编程 apue.dhs.org·[FROM: 210.72.245.13] --
※ 转寄:·UNIX编程 apue.dhs.org·[FROM: 210.39.3.50]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店