Project

General

Profile

Actions

Bug #17810

open

addr2line.c: Some symbol names missing in C backtrace with Clang/LLVM

Added by xtkoba (Tee KOBAYASHI) 3 months ago. Updated 3 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:103491]

Description

When Clang/LLVM is used for compilation, some symbol names are missing in C level backtrace information. An example:

-- C level backtrace information -------------------------------------------
(...snip...)
/var/tmp/ruby.debug/lib/libruby.so.3.1(vm_call_method_each_type+0x6a) [0x7f73856ac33f] ../vm_insnhelper.c:3438
/var/tmp/ruby.debug/lib/libruby.so.3.1(0x7f73856ac29a) [0x7f73856ac29a]
/var/tmp/ruby.debug/lib/libruby.so.3.1(0x7f73856aadf6) [0x7f73856aadf6]
/var/tmp/ruby.debug/lib/libruby.so.3.1(vm_exec_core+0xff7) [0x7f738569c3cd] ../insns.def:792
/var/tmp/ruby.debug/lib/libruby.so.3.1(rb_vm_exec+0x5c9) [0x7f73856a78d4]
/var/tmp/ruby.debug/lib/libruby.so.3.1(rb_ec_exec_node+0xe5) [0x7f73855a1bec] ../eval.c:320
/var/tmp/ruby.debug/lib/libruby.so.3.1(ruby_run_node+0x5a) [0x7f73855a1acf] ../eval.c:379
/var/tmp/ruby.debug/bin/ruby(main+0x73) [0x55c15877ac4b] ../main.c:47

This seems to happen because dladdr(3) sometimes fills NULL in dli_sname which is then overwritten to lines[i].sname regardless of its previous value.

A patch is attached to fix this issue. It modifies addr2line.c so that it does not use dli_sname (and also dli_fname) when the value is NULL.

I also attach another patch that makes addr2line.c print source filename even when source lineno is not available (which is the case for rb_vm_exec in the above example).

When these two patches are applied, C level backtrace information is printed as follows.

-- C level backtrace information -------------------------------------------
(...snip...)
/var/tmp/ruby.debug/lib/libruby.so.3.1(vm_call_method_each_type+0x6a) [0x7fb08928231f] ../vm_insnhelper.c:3438
/var/tmp/ruby.debug/lib/libruby.so.3.1(vm_call_method+0xf6) [0x7fb08928227a] ../vm_insnhelper.c:0
/var/tmp/ruby.debug/lib/libruby.so.3.1(vm_sendish+0x334) [0x7fb089280dd6] ../vm_insnhelper.c:0
/var/tmp/ruby.debug/lib/libruby.so.3.1(vm_exec_core+0xff7) [0x7fb0892723ad] ../insns.def:792
/var/tmp/ruby.debug/lib/libruby.so.3.1(rb_vm_exec+0x5c9) [0x7fb08927d8b4] ../vm.c:0
/var/tmp/ruby.debug/lib/libruby.so.3.1(rb_ec_exec_node+0xe5) [0x7fb089177bcc] ../eval.c:320
/var/tmp/ruby.debug/lib/libruby.so.3.1(ruby_run_node+0x5a) [0x7fb089177aaf] ../eval.c:379
/var/tmp/ruby.debug/bin/ruby(main+0x73) [0x557ed1e0bc4b] ../main.c:47

Files

ruby-addr2line-do-not-overwrite-sname-with-null.patch (1.07 KB) ruby-addr2line-do-not-overwrite-sname-with-null.patch Do not overwrite sname with NULL xtkoba (Tee KOBAYASHI), 04/17/2021 06:36 AM
ruby-addr2line-print-filename-without-lineno.patch (574 Bytes) ruby-addr2line-print-filename-without-lineno.patch Print filename without lineno xtkoba (Tee KOBAYASHI), 04/17/2021 06:37 AM

Updated by xtkoba (Tee KOBAYASHI) 3 months ago

PR: https://github.com/ruby/ruby/pull/4438

The second patch is omitted from the PR, because it turns out to be not very useful. The corresponding source file name should be easily guessable from the symbol name.

Actions

Also available in: Atom PDF