`
灵动的水
  • 浏览: 194588 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

通过编程方式获取backtrace(函数调用栈)

阅读更多
过编程方式获取backtrace(函数调用栈)
在用GDB调试器时可以查看所谓的Backtrace,它包含一系列的函数调用信息,用命令backtrace或bt可以在GDB中查看函数调用栈的信 息。有些场合没法使用GDB时,则可以用glibc库函数中的一些相关函数来得到backtrace的信息(在头文件execinfo.h中): // 获取将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的信息:
1 #include <execinfo.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 /* Obtain a backtrace and print it to stdout. */
6 void print_trace (void)
7 {
8 void *array[10];
9 size_t size;
10 char **strings;
11 size_t i;
12
13 size = backtrace (array, 10);
14 strings = backtrace_symbols (array, size);
15
16 printf ("Obtained %zd stack frames.\n", size);
17
18 for (i = 0; i < size; i++)
19 printf ("%s\n", strings[i]);
20
21 free (strings);
22 }
23
24 /* A dummy function to make the backtrace more interesting. */
25 void dummy_function (void)
26 {
27 print_trace ();
28 }
29
30 int main (void)
31 {
32 dummy_function ();
33 return 0;
34 }

编译运行的结果如下: # 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]

你可以应用这些函数在程序异常退出时打印backtrace或将它保存到某个文件中,用于之后的分析
分享到:
评论

相关推荐

    Linux例程之二_Debug_显示当前函数调用关系

    通过这个示例,我们可以了解如何使用 backtrace 函数显示当前函数调用关系,并应用于程序的调试和优化中。该技术可以帮助我们更好地了解程序的执行路径,从而提高程序的可维护性和可读性。 知识点: * backtrace ...

    追踪谁调用了函数

    通过遍历这个堆栈,我们可以逆序地查看函数调用的顺序,从而得知哪些函数调用了目标函数。 在C++中,实现堆栈追踪通常有两种方法: 1. **利用编译器支持**:一些编译器如GCC和Visual C++提供了内置的函数来获取...

    linux程序栈回溯

    当程序崩溃时,如果设置了断点或者使用`gdb attach`命令附加到进程上,可以使用`backtrace`或`bt`命令查看当前的函数调用堆栈。此外,还可以通过编译时开启`-ggdb`选项,使编译后的二进制文件包含调试信息,这样GDB...

    cpp打印调用堆栈

    标题“cpp打印调用堆栈”涉及到的是C++编程中的一种调试技巧,即在程序运行时获取函数调用序列的能力。这种技术对于定位程序错误、理解代码执行流程以及进行性能分析非常有用。以下是对这个主题的详细解释: 在C++...

    C语言的那些小秘密之函数的调用关系

    通常,这需要借助调试器如GDB来查看函数调用栈。然而,了解其背后的原理意味着在没有调试器的环境下,我们也能手动实现类似的功能。 `backtrace()`函数是GNU C Library (glibc) 提供的一个实用工具,用于获取当前...

    调用堆栈的类

    在编程领域,调用堆栈(Call Stack)是程序执行过程中不可或缺的一部分,它记录了函数调用的顺序。当一个函数被调用时,它的相关信息(如返回地址、局部变量等)会被推入堆栈,形成一个堆栈帧。本文将深入探讨如何...

    A beautiful stack trace pretty printer for C++.zip

    4. **栈回溯(Stack Backtrace)**:通过获取当前进程的内存映射信息和栈指针,可以生成栈回溯,显示调用栈的状态。在C++中,可以使用如`backtrace()`和`backtrace_symbols()`等函数来实现这一功能,但其输出通常...

    PHP中调试函数debug_backtrace的使用示例代码

    例如,如果你发现一个错误发生在特定的函数调用中,`debug_backtrace` 将提供足够的上下文信息来定位问题。 PHP 官方文档(http://php.net/manual/zh/function.debug-backtrace.php)提供了更多关于 `debug_...

    即用即查PHP函数参考手册附书光盘

    同时,还有调试工具,如`var_dump`和`debug_backtrace`,用于查看变量状态和调用栈信息。 4. 文件系统操作: PHP提供了丰富的文件系统函数,如`file_get_contents`用于读取文件,`file_put_contents`用于写入文件,...

    用GDB调试程序(Debugging with GDB)

    - 对于循环或其他耗时操作,可以通过查看函数调用栈和变量值等方式来优化程序性能。 - **解决逻辑错误** - 通过单步执行和查看变量值,可以帮助开发者找到导致逻辑错误的原因。 #### 五、案例分析与实践建议 - *...

    PHP常用函数PDF文件

    - `debug_backtrace()`:获取调用堆栈的回溯。 6. **日期和时间函数**: - `date()`:格式化本地日期和时间。 - `strtotime()`:将日期或时间字符串转换为Unix时间戳。 - `datetime()`:创建一个DateTime对象,...

    认识 Linux Memory

    栈用于管理函数调用时的临时变量,通常向下增长,每次函数调用都会创建一个新的栈帧,保存参数、局部变量和返回地址。 在Linux内存模型的测试程序中,我们可以看到不同类型的内存分配。main和print函数的地址位于...

    c-stack-trace-src.zip

    - **glibc的backtrace函数**:在Linux或类似的Unix系统中,可以使用`backtrace()`函数获取堆栈指针数组,然后通过`backtrace_symbols()`将其转换为可读的符号信息。 - **DWARF调试信息**:编译时启用调试信息(-g...

    linux下的gdb调试

    通过`info backtrace`或`bt`命令,可以查看当前的函数调用栈,了解程序的执行流程: ```bash bt ``` #### 修改变量值 在调试过程中,如果需要修改某个变量的值,可以使用`set variable`命令: ```bash set ...

    MyStaceTrace打印堆栈代码

    在编程领域,有时候我们需要了解程序执行的流程,找出问题的根源,这时就需要使用到堆栈跟踪(也称为回溯或backtrace)。堆栈跟踪能够帮助我们查看程序在运行时调用函数的顺序,从而定位问题所在。在标题...

    linux下C++调试技术

    - `backtrace` 或 `bt`:显示函数调用栈,用于查看程序在何处停止以及调用路径。 - `finish`:执行当前函数直至返回,然后暂停,等待进一步的命令。 - `frame` 或 `f`:切换到指定的栈帧,查看不同级别的函数调用。 ...

    php常用函数大收集

    - `debug_backtrace()`:返回调用栈信息。 - `var_dump()`:显示变量的相关信息。 - `ini_set()`:更改配置选项的值。 6. **类型转换函数**: - `(int)`/`(float)`/`(string)`:强制类型转换。 - `is_int()`/`...

    php的debug相关函数用法示例

    调用栈是函数调用的顺序列表,它显示了程序运行过程中函数是如何被调用的。debug_backtrace()函数不仅可以帮助开发者理解当前代码的执行流程,还可以在调试代码时定位问题发生的源头。 debug_backtrace()函数可以...

    Python-高效使用pdb的一个简单的教程

    - `up`/`down`:向上/向下遍历调用栈,查看不同层级的函数调用情况。 五、条件断点和忽略次数 - `condition 断点号 表达式`:设定断点触发条件,只有当表达式为真时才会暂停。 - `ignore 断点号 次数`:设置断点在...

Global site tag (gtag.js) - Google Analytics