我在程序中的某个点上进行了堆栈跟踪.一旦与libc中的backtrace_symbols()功能,一旦与unw_get_proc_name()来自libunwind.
backtrace_symbols()输出:
/home/jj/test/mylib.so(+0x97004)[0x7f6b47ce9004]
Run Code Online (Sandbox Code Playgroud)
unw_get_proc_name()输出:
ip: 0x7f6b47ce9004, offset: 0x458e4
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到指令指针地址(0x7f6b47ce9004)是相同且正确的.功能失调0x97004来自backtrace_symbols()也是正确的,但没有一个我从拿到unw_get_proc_name() (0x458e4).
有人知道这里发生了什么以及可能导致这种抵消差异的原因是什么?
两种方法都使用类似的代码,如下面的示例:
回溯():
void *array[10];
size_t size;
size = backtrace(array, 10);
backtrace_symbols_fd(array, size, STDERR_FILENO);
Run Code Online (Sandbox Code Playgroud)
libunwind:
unw_cursor_t cursor;
unw_context_t context;
unw_getcontext(&context);
unw_init_local(&cursor, &context);
while (unw_step(&cursor) > 0) {
unw_word_t offset, pc;
char fname[64];
unw_get_reg(&cursor, UNW_REG_IP, &pc);
fname[0] = '\0';
(void) unw_get_proc_name(&cursor, fname, sizeof(fname), &offset);
printf ("%p : (%s+0x%x) [%p]\n", pc, fname, offset, …Run Code Online (Sandbox Code Playgroud) 我刚读完
现在已经很老了(5年)。一些答案提出了解决方案,允许您为每个堆栈帧获取函数的名称和偏移量(我猜是在堆栈内)。但是我(可能还有其他人)真正需要的是进行调用的源文件名和行号(假设代码是用调试信息编译的)。链接到执行此操作的 glibc 的一部分的答案之一(libSegfault;请参阅此目录中的文件- segfault.c, backtracesyms.c, backtracesymsfd.c) - 所以它是可能的。
我的问题是:
笔记:
-g; 当然,在适当的库中,我们会检查调试信息是否可用。我正在运行这个命令——
/usr/bin/c++ CMakeFiles/XYZ.dir/test/XYZ.cpp.o CMakeFiles/XYZ.dir/test/TempDir.cpp.o
-o XYZ libXYZMaster.so -lboost_filesystem -lboost_system
/usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.so -lboost_random
-lboost_iostreams -lboost_thread -ldw -lunwind
-Wl,-rpath,/home/user885/untitled/build
Run Code Online (Sandbox Code Playgroud)
但我收到这个链接器错误 -
libXYZMaster.so: undefined reference to `_Ux86_64_step'
libXYZMaster.so: undefined reference to `_Ux86_64_init_local'
libXYZMaster.so: undefined reference to `_Ux86_64_get_proc_name'
libXYZMaster.so: undefined reference to `_Ux86_64_get_reg'
Run Code Online (Sandbox Code Playgroud)
当我执行 nm -DI 时,确实看到了定义的符号 -
$ nm -D /usr/lib/x86_64-linux-gnu/libunwind.so | grep -P "_step|init_local|get_proc_name|get_reg"
00000000000031d0 T _ULx86_64_get_proc_name
0000000000003370 T _ULx86_64_get_reg
0000000000004510 T _ULx86_64_init_local
0000000000004d20 T _ULx86_64_step
Run Code Online (Sandbox Code Playgroud)
另外,libXYZMaster.so 的 ldd 表明 libunwind 已链接——
linux-vdso.so.1 => (0x00007ffd58f4a000)
libdw.so.1 => /usr/lib/x86_64-linux-gnu/libdw.so.1 (0x00007ff614bac000)
libunwind.so.8 => /usr/lib/x86_64-linux-gnu/libunwind.so.8 (0x00007ff614991000) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Mac 上为 iOS 和 Mac 构建 libunwind,我能够解决一些编译问题。
在 Mac 上构建
我使用配置项目
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
Run Code Online (Sandbox Code Playgroud)
并elf.h从谷歌的breakpad项目复制。
https://google-breakpad.googlecode.com/svn-history/r1017/trunk/src/common/android/include/elf.h
我现在收到以下错误:
/usr/include/elf.h:58:15: fatal error: 'elf.h' file not found
#include_next <elf.h>
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我解决这个问题或者还有其他一些构建 libunwind 的过程吗?
我还想知道是否还需要做其他事情来为 iOS 构建 libunwind。
也许我只是找不到它,但是我想向我的项目中添加一些代码(libunwind在这里找到http://www.nongnu.org/libunwind/download.html)
该库没有CMakeLists附带。 txt文件,当我尝试包含txt文件时,cmake抱怨这一事实。现在,我只是将libunwind目录添加到外部代码,并在主CMakeLists.txt中添加了引用
任何输入都会很棒。