Linux 下有简单办法打印应用程序的 backtrace 吗?

2022-08-19 19:37:06 +08:00
 huangya
应用程序蛮复杂的,并且还带多个动态链接库。现在想打印某个函数调用的 backtrace.有方便的办法吗?
在内核中可以调用 dump_stack.应用程序呢?搜索了一下,似乎没有很方便的办法。有个初步的想法是故意触发一个 crash,然后获取 coredump, 最后用 gdb 去看 backtrace.还没实践。
2376 次点击
所在节点    Linux
7 条回复
Ediacaran
2022-08-19 19:45:57 +08:00
unwind
0o0O0o0O0o
2022-08-19 19:46:29 +08:00
libunwind
huangya
2022-08-19 19:53:50 +08:00
@Ediacaran
@0o0O0o0O0o 感谢两位,我研究一下怎么安装。因为程序是一个嵌入式程序,涉及到怎么放到 buildroot 和交叉编译
microxiaoxiao
2022-08-19 21:22:26 +08:00
我觉得你需要的是 ptrace ,嘻嘻。
Madcrow
2022-08-19 22:59:17 +08:00
函数里调用一下:

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

void print_trace(void) {
char **strings;
size_t i, size;
enum Constexpr { MAX_SIZE = 1024 };
void *array[MAX_SIZE];
size = backtrace(array, MAX_SIZE);
strings = backtrace_symbols(array, size);
for (i = 0; i < size; i++)
printf("%s\n", strings[i]);
puts("");
free(strings);
}
```
Inn0Vat10n
2022-08-19 23:44:07 +08:00
简单的方式,while true 或者 sleep, gdb/pstack 看
by73
2022-08-21 14:17:50 +08:00
如果内核比较新的话,可以考虑用 bpftrace ,但是这玩意编译比较痛苦。。用它依赖的 [uprobe]( https://www.kernel.org/doc/html/latest/trace/uprobetracer.html) 相对来说也可行,不过我没咋研究过😂

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/874064

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX