2

我有一个生成两个线程的 ruby​​ 程序。很少,它似乎挂在主线程上,我正在尝试使用 gdb 找出原因。

使用此处的博客文章,我使用 gdb 附加到进程,并调用rb_backtrace()以获取回溯。

问题是,回溯总是来自产生的工作线程之一,而不是我遇到挂起的主线程。

有没有办法从特定线程获取回溯?

我曾尝试使用 gdb 命令info threadsthread 2更改活动线程,但它没有效果。我也尝试过ruby_eval在 gdb 中使用定义,如此处所述但是每当我尝试评估一行 ruby​​ 代码时,我都会收到错误No symbol table is loaded. Use the "file" command. 因为我正在使用嵌入式系统,所以我无法轻松地使用 gdb 符号重新编译 ruby​​。

4

1 回答 1

2

rb_backtrace()ruby_current_thread您可以覆盖的全局变量:

# Make a note of the old thread pointer so you can put it back.
(gdb) p ruby_current_thread
$1 = (rb_thread_t *) 0x5619dfe485e0

(gdb) set ruby_current_thread = 0x5619efb7d3a0

(gdb) p ruby_current_thread
$2 = (rb_thread_t *) 0x5619efb7d3a0

# Write the backtrace to stderr
(gdb) call (void) rb_backtrace()

ruby 线程指针(0x5619efb7d3a0上面)可以在您感兴趣的本机线程的 GDB 回溯中找到,例如。

#7  0x00005619de86cf96 in vm_exec (th=th@entry=0x5619efb7d3a0) at vm.c:1693

在让进程恢复之前,请务必ruby_current_thread恢复其原始值。在 Ruby 2.3.8 上测试。

于 2021-04-26T05:45:54.213 回答