问题标签 [libunwind]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
47 浏览

c++ - 如何测试只返回系统值的 API?

假设我们有一个例程

这种例程的单元测试必须是什么?当然,我可以使用一些系统调用来获取 CPU 寄存器和类似的东西,然后将其与例程返回的内容进行比较。但是对于单元测试来说,它似乎需要做很多工作。测试理论对测试此类 API 有什么看法?

0 投票
1 回答
131 浏览

c++ - 使用 libunwind 获取模块地址

我使用 libunwind 从堆栈帧中提取指令指针,如下所示:

但是,这只给了我函数指针的动态地址。我想接收模块中的静态地址,以便我可以通过 addr2line 查询它们。

当时另一个线程没有收到答案。你知道如何获得这些信息吗?

问候

0 投票
0 回答
128 浏览

linux - 防止 PIN_Backtrace() 不成功退出

我有一个 pintool 可以调用PIN_Backtrace(). 似乎libunwind不支持某些寄存器x86_64,这会导致以下错误消息和异常退出:

即使出现这些错误,我也希望程序继续运行。处理这种情况的最有效方法是什么?

我调试了我的pintool使用gdbabort()这是调试器接收到的回溯:

info proc mapping显示地址范围如下:

似乎使用的libunwindPinPinCRT. 这可以在以下info /proc/<PID>/maps输出中看到pintool

0 投票
1 回答
494 浏览

error-handling - _Unwind_Backtrace 用于 FreeRTOS 上的不同上下文

您好我正在尝试在 FreeRTOS 项目中实现错误处理。在 WatchDog 复位之前,处理程序由 WatchDog 中断触发。这个想法是记录失败任务的任务名称+调用堆栈。
我设法回溯了一个调用堆栈,但是在错误的上下文中,中断的上下文。虽然我需要存储在 pxCurrentTCB 中的失败任务的上下文。但我不知道如何告诉 _Unwind_Backtrace 使用它而不是中断上下文,它是从中调用的。所以我想 _Unwind_Backtrace 不是调用它的上下文,而是在 pxCurrentTCB 中找到的不同上下文。我已经搜索并试图了解 _Unwind_Backtrace 是如何工作的,但没有成功,所以请帮忙。
任何帮助将不胜感激,尤其是示例代码。谢谢你。

0 投票
1 回答
645 浏览

c - 使用 libunwind 实现异常

在编译器上工作,需要一些帮助来理解和使用 libunwind。这是我到目前为止所拥有的:

好吧,这已经很混乱了,但是一些上下文可能有助于证明奇怪的选择是正确的。我想做的是在调用throw_exception后的任何时候调用调用堆栈set_tryfoo以便展开堆栈并将CPU状态恢复到调用之后set_try但条件之前的状态。虽然这目前只是一个小型 C 程序,但我打算在编译器中使用这些函数的一般结构,以生成必要的函数调用(类似于在 C++ 中使用 g++ 完成异常的方式),这就是为什么我有label+goto 作为一种快速模仿我将要生成的程序集的方法。我尝试过使用 libunwind 的 setjmp 实现,但它不太适合我的用例。

我遇到的问题与unw_resume展开调用堆栈后的恢复位置有关。printf("This should never run\n")无论如何,似乎每次都会运行。我的理解是它应该将堆栈和 CPU 状态恢复到调用时存储的任何状态unw_getcontext,并且我认为存储的状态是正确的,因为 IP 寄存器(或 PC 寄存器,因为这是 x86_64)的值当我调用set_tryand时,光标中的内容完全相同throw_exception。我什至在调用 set_try 之后和条件之前多次跳入 gdb 来查看 PC 寄存器,并且每次都匹配打印输出。

我的问题是:

  • 我误会了unw_resume吗?
  • 我是否需要修改 PC (UNW_REG_IP) 寄存器?
  • 是否有其他地方(除了 nongnu.org 文档)我可以寻求有关 libunwind 的帮助?

提前致谢!

0 投票
1 回答
483 浏览

glibc - 在 Centos 6.10 上损坏了 yum,由于缺少 libunwind,无法错误安装缺少的 GLIBC

我在 Centos 6.10 上安装了 nvidia-drivers,其中包含一个 --skip-broken 标志,并且可能损坏了 yum。每当我运行yum命令时,都会弹出此错误。

我偶然发现了这个关于安装缺少的 GLIBC 版本的线程,但我在步骤 8 中遇到了这个错误../configure --prefix=/opt/glibc-2.14

然后把我带到了这个论坛帖子,上面说我应该通过 yum 安装 libunwind。这是我最初的问题,因此让我陷入了僵局。我应该怎么办?

0 投票
0 回答
110 浏览

gdb - 是否可以为使用 ptrace/gdb 停止的进程获取内核回溯?

我在 Linux 上使用ptrace(2)andlibunwind从正在运行的进程中采样用户级堆栈,效果很好。但是,如果我尝试查看内核级堆栈,/proc/<pid>/stack我总是会看到以下内容:

也就是说,该进程的当前内核级堆栈位于 中ptrace_stop(),而不是它之前所做的(以及我感兴趣的)。

有什么办法可以避免这种情况并读取停止的进程的原始内核级堆栈ptrace(2)?我观察到附加到调试器的进程的相同行为,例如gdb,所以我认为解决方案是相同的。

0 投票
1 回答
68 浏览

c - fnc(3) 中的 (3) 是什么意思?

查看 libunwind.h 文档(https://www.nongnu.org/libunwind/docs.html),

所有函数(ex.libunwind-ia64(3)、unw_get_proc_name(3))都有 fnc 名称 + (3)。(3) 是什么意思?

0 投票
0 回答
153 浏览

c++ - unw_get_proc_name() 偶尔返回 UNW_EUNSPEC 和 UNW_ENOINFO 错误

我正在使用 libunwind 1.4.0 来收集堆栈跟踪。它几乎总是有效,但在某些情况下我得到unspecified (general) errorno unwind info found调用unw_get_proc_name. 我可以遍历 core-dumps 中的堆栈跟踪(使用 gdb),并且下次运行程序时,同一台机器上的相同二进制文件运行没有任何问题。任何人都遇到过类似的问题并且知道如何解决这个问题?

0 投票
2 回答
231 浏览

c - 远程进程的源代码名称和行号

您好我正在尝试创建某种调试器来查看系统调用以检测它们,但从可用性的角度来看,我希望能够获取检测到错误的源代码名称和行号。我一直在使用名为 libunwind 的库,但它给了我函数名、函数偏移量以及可执行文件地址空间中的程序计数器。但是,如果您查看 valgrind 或 gdb,它会在使用 -g 标志编译时为您提供行号和源代码名称。我该怎么做?