标签: libunwind

libc的backtrace_symbols()和libunwind的unw_get_proc_name()中的不同偏移量

我在程序中的某个点上进行了堆栈跟踪.一旦与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)

libc stack-trace backtrace libunwind

8
推荐指数
1
解决办法
1331
查看次数

是否有一种可移植/符合标准的方法来获取堆栈跟踪中的文件名和行号?

我刚读完

当我的 gcc C++ 应用程序崩溃时如何生成堆栈跟踪

现在已经很老了(5年)。一些答案提出了解决方案,允许您为每个堆栈帧获取函数的名称和偏移量(我猜是在堆栈内)。但是我(可能还有其他人)真正需要的是进行调用的源文件名和行号(假设代码是用调试信息编译的)。链接到执行此操作的 glibc 的一部分的答案之一(libSegfault;请参阅此目录中的文件- segfault.c, backtracesyms.c, backtracesymsfd.c) - 所以它是可能的

我的问题是:

  • 可以以独立于平台的方式提取此信息,还是可以符合某种标准(POSIX??)
  • 为什么 libunwind 不支持这个?(我认为没有,在浏览了他们的网站后
  • 这是否一定取决于您的编译器的 C/C++ 标准库(至少对于 C/C++ 应用程序)?

笔记:

  • 你可以假设二进制文件有调试信息,所以在 C/C++ 的情况下,它是用-g; 当然,在适当的库中,我们会检查调试信息是否可用。

c c++ glibc stack-trace libunwind

7
推荐指数
1
解决办法
1242
查看次数

在我的项目中链接 libunwind 库时出现链接器错误

我正在运行这个命令——

/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)

c++ linker linker-errors libunwind

3
推荐指数
1
解决办法
2730
查看次数

为 Mac 构建 libunwind

我正在尝试在 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。

macos ios ios5 libunwind

2
推荐指数
1
解决办法
3607
查看次数

将库添加到Cmake项目

也许我只是找不到它,但是我想向我的项目中添加一些代码(libunwind在这里找到http://www.nongnu.org/libunwind/download.html
该库没有CMakeLists附带。 txt文件,当我尝试包含txt文件时,cmake抱怨这一事实。现在,我只是将libunwind目录添加到外部代码,并在主CMakeLists.txt中添加了引用

任何输入都会很棒。

c++ build cmake libunwind

1
推荐指数
1
解决办法
3003
查看次数

标签 统计

libunwind ×5

c++ ×3

stack-trace ×2

backtrace ×1

build ×1

c ×1

cmake ×1

glibc ×1

ios ×1

ios5 ×1

libc ×1

linker ×1

linker-errors ×1

macos ×1