博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程基础-----c语言打印调用栈
阅读量:6511 次
发布时间:2019-06-24

本文共 5946 字,大约阅读时间需要 19 分钟。

  hot3.png

官方介绍:

SYNOPSIS         

#include 
int backtrace(void **buffer, int size); char **backtrace_symbols(void *const *buffer, int size); void backtrace_symbols_fd(void *const *buffer, int size, int fd);

DESCRIPTION         

backtrace() returns a backtrace for the calling program, in the array       pointed to by buffer.  A backtrace is the series of currently active       function calls for the program.  Each item in the array pointed to by       buffer is of type void *, and is the return address from the       corresponding stack frame.  The size argument specifies the maximum       number of addresses that can be stored in buffer.  If the backtrace       is larger than size, then the addresses corresponding to the size       most recent function calls are returned; to obtain the complete       backtrace, make sure that buffer and size are large enough.       Given the set of addresses returned by backtrace() in buffer,       backtrace_symbols() translates the addresses into an array of strings       that describe the addresses symbolically.  The size argument       specifies the number of addresses in buffer.  The symbolic       representation of each address consists of the function name (if this       can be determined), a hexadecimal offset into the function, and the       actual return address (in hexadecimal).  The address of the array of       string pointers is returned as the function result of       backtrace_symbols().  This array is ed by       backtrace_symbols(), and must be freed by the caller.  (The strings       pointed to by the array of pointers need not and should not be       freed.)       backtrace_symbols_fd() takes the same buffer and size arguments as       backtrace_symbols(), but instead of returning an array of strings to       the caller, it writes the strings, one per line, to the file       descriptor fd.  backtrace_symbols_fd() does not call , and       so can be employed in situations where the latter function might       fail.

RETURN VALUE         

backtrace() returns the number of addresses returned in buffer, which       is not greater than size.  If the return value is less than size,       then the full backtrace was stored; if it is equal to size, then it       may have been truncated, in which case the addresses of the oldest       stack frames are not returned.       On success, backtrace_symbols() returns a pointer to the array       ed by the call; on error, NULL is returned.

VERSIONS         

backtrace(), backtrace_symbols(), and backtrace_symbols_fd() are       provided in glibc since version 2.1.

CONFORMING TO         

These functions are GNU extensions.

NOTES         

These functions make some assumptions about how a function's return       address is stored on the stack.  Note the following:       *  Omission of the frame pointers (as implied by any of 's          nonzero optimization levels) may cause these assumptions to be          violated.       *  Inlined functions do not have stack frames.       *  Tail-call optimization causes one stack frame to replace another.       The symbol names may be unavailable without the use of special linker       options.  For systems using the GNU linker, it is necessary to use       the -rdynamic linker option.  Note that names of "static" functions       are not exposed, and won't be available in the backtrace.

EXAMPLE         

The program below demonstrates the use of backtrace() and       backtrace_symbols().  The following shell session shows what we might       see when running the program:           $ cc -rdynamic prog.c -o prog           $ ./prog 3           backtrace() returned 8 addresses           ./prog(myfunc3+0x5c) [0x80487f0]           ./prog [0x8048871]           ./prog(myfunc+0x21) [0x8048894]           ./prog(myfunc+0x1a) [0x804888d]           ./prog(myfunc+0x1a) [0x804888d]           ./prog(main+0x65) [0x80488fb]           /lib/libc.so.6(__libc_start_main+0xdc) [0xb7e38f9c]           ./prog [0x8048711]

Program source

#include 
#include
#include
#include
void myfunc3(void) { int j, nptrs; #define SIZE 100 void *buffer[100]; char **strings; nptrs = backtrace(buffer, SIZE); printf("backtrace() returned %d addresses\n", nptrs); /* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO) would produce similar output to the following: */ strings = backtrace_symbols(buffer, nptrs); if (strings == NULL) { perror("backtrace_symbols"); exit(EXIT_FAILURE); } for (j = 0; j < nptrs; j++) printf("%s\n", strings[j]); free(strings); } static void /* "static" means don't export the symbol... */ myfunc2(void) { myfunc3(); } void myfunc(int ncalls) { if (ncalls > 1) myfunc(ncalls - 1); else myfunc2(); } int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "%s num-calls\n", argv[0]); exit(EXIT_FAILURE); } myfunc(atoi(argv[1])); exit(EXIT_SUCCESS); }

自己示例:

[cpp]   
 
  1. #include <stdio.h>  
  2. #include <execinfo.h>  
  3. #include <stdlib.h>  
  4.   
  5. void fun1();  
  6. void fun2();  
  7. void fun3();  
  8. void print_stack();  
  9.   
  10. int main()  
  11. {  
  12.     fun3();  
  13.     return 0;  
  14. }  
  15.   
  16. void fun1()  
  17. {  
  18.     printf("print_stack begin\n");    
  19.     print_stack();  
  20. }  
  21.   
  22. void fun2()  
  23. {  
  24.     fun1();  
  25. }  
  26.   
  27. void fun3()  
  28. {  
  29.     fun2();  
  30. }  
  31.   
  32. void print_stack()  
  33. {  
  34.     int size = 16;  
  35.     int i;    
  36.     void *array[16];  
  37.     int stack_num = backtrace(array, size);  
  38.     char **stacktrace = NULL;  
  39.           
  40.     stacktrace = (char**)backtrace_symbols(array, stack_num);  
  41.       
  42.     for(i = 0; i < stack_num; i++)  
  43.     {  
  44.         printf("%s\n", stacktrace[i]);  
  45.     }  
  46.     free(stacktrace);  
  47. }  
编译:

原博文地址   http://blog.csdn.net/yf210yf/article/details/14642837

转载于:https://my.oschina.net/shadai/blog/698970

你可能感兴趣的文章
CRM, C4C和Hybris的工作流简介
查看>>
IBM笔记本启动时显示The LAN adapter's configuration is corrupted or has not been initialized.
查看>>
框架之间传值刷新
查看>>
The message queue
查看>>
oracle手动删除数据库
查看>>
Linux C取整的方法
查看>>
几种常用排序算法温习
查看>>
爱普生6轴机器人将上市 机器人小型化进程又迈一步
查看>>
CentOS 7 Zabbix 3.2 配置 1.0版
查看>>
Linux Software
查看>>
Exchange HAB创建
查看>>
zabbix监控环境的搭建
查看>>
python3-数据类型
查看>>
MySQL5.7--------基于CentOS6二进制包安装
查看>>
报表开发之自定义函数
查看>>
ssh登陆主机遇到Host key varification failed故障
查看>>
lvs十种调度策略+三种模式
查看>>
zabbix监控防火墙和交换机
查看>>
eureka(注册中心)中spring-boot-starter-actuator监控
查看>>
配置ADT T520
查看>>