--- Begin Message ---
Package: xserver-xorg-core
Version: 2:1.20.8-2
Severity: wishlist
Dear Maintainer,
in the past I was trying to make sense of some backtraces written
by Xorg, but failed, e.g. in #969739.
I did now some debugging and found that in function xorg_backtrace
the function begin retrieved by unw_get_proc_info in "pip.start_ip"
cannot always be used for calculations with "off".
This is because this "off" offset is calculated in unw_get_proc_name
from the nearest symbol, which does not necessarily match pip.start_ip.
Attached patch separately retrieves the instruction pointer by unw_get_reg
and uses that value for the output. A short in gdb wrote with this patch
applied the same addresses as the bt command.
What do you think?
Kind regards,
Bernhard
-- Package-specific info:
/etc/X11/X does not exist.
/etc/X11/X is not a symlink.
/etc/X11/X is not executable.
-- System Information:
Debian Release: bullseye/sid
APT prefers testing-debug
APT policy: (500, 'testing-debug'), (500, 'proposed-updates-debug'), (500,
'testing')
Architecture: amd64 (x86_64)
Kernel: Linux 5.8.0-2-amd64 (SMP w/4 CPU threads)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages xserver-xorg-core depends on:
ii keyboard-configuration 1.196
ii libaudit1 1:2.8.5-3+b1
ii libbsd0 0.10.0-1
ii libc6 2.31-3
ii libdbus-1-3 1.12.20-1
ii libdrm2 2.4.102-1
ii libegl1 1.3.2-1
ii libepoxy0 1.5.4-1
ii libgbm1 20.1.8-1
ii libgcrypt20 1.8.6-2
ii libgl1 1.3.2-1
ii libpciaccess0 0.16-1
ii libpixman-1-0 0.36.0-1
ii libselinux1 3.1-2
ii libsystemd0 246.6-1
ii libudev1 246.6-1
ii libunwind8 1.3.2-2
ii libxau6 1:1.0.8-1+b2
ii libxdmcp6 1:1.1.2-3
ii libxfont2 1:2.0.3-1
ii libxshmfence1 1.3-1
ii udev 246.6-1
ii xserver-common 2:1.20.8-2
Versions of packages xserver-xorg-core recommends:
ii libgl1-mesa-dri 20.1.8-1
ii libpam-systemd 246.6-1
>From 2c1cd5ebf5e9281c2e02b9fcaf4430b314a44909 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bernhard=20=C3=9Cbelacker?= <bernha...@mailbox.org>
Date: Sun, 27 Sep 2020 18:03:48 +0200
Subject: Do not mix the function begin address from unw_get_proc_info and the
offset from unw_get_proc_name.
---
os/backtrace.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/os/backtrace.c b/os/backtrace.c
index 619bf14..2aad0e3 100644
--- a/os/backtrace.c
+++ b/os/backtrace.c
@@ -45,6 +45,7 @@ xorg_backtrace(void)
{
unw_cursor_t cursor;
unw_context_t context;
+ unw_word_t ip;
unw_word_t off;
unw_proc_info_t pip;
int ret, i = 0;
@@ -88,7 +89,9 @@ xorg_backtrace(void)
procname[1] = 0;
}
- if (dladdr((void *)(uintptr_t)(pip.start_ip + off), &dlinfo) && dlinfo.dli_fname &&
+ if (unw_get_reg (&cursor, UNW_REG_IP, &ip) < 0)
+ ip = pip.start_ip + off;
+ if (dladdr((void *)(uintptr_t)(ip), &dlinfo) && dlinfo.dli_fname &&
*dlinfo.dli_fname)
filename = dlinfo.dli_fname;
else
@@ -96,7 +99,7 @@ xorg_backtrace(void)
ErrorFSigSafe("%u: %s (%s%s+0x%x) [%p]\n", i++, filename, procname,
ret == -UNW_ENOMEM ? "..." : "", (int)off,
- (void *)(uintptr_t)(pip.start_ip + off));
+ (void *)(uintptr_t)(ip));
ret = unw_step(&cursor);
if (ret < 0)
--
2.28.0
# Bullseye/testing amd64 qemu VM 2020-09-25
apt update
apt dist-upgrade
apt install ccache cmake make g++-multilib gdb pkg-config coreutils
python3-pexpect manpages-dev git ninja-build capnproto libcapnp-dev
git clone https://github.com/mozilla/rr.git
mkdir obj && cd obj
cmake ../rr
make -j$(nproc)
apt install systemd-coredump psmisc mc fakeroot gdb xserver-xorg xterm openbox
xserver-xorg-core-dbgsym libdbus-1-3-dbgsym libunwind8-dbgsym
apt build-dep xserver-xorg-core
echo 1 > /proc/sys/kernel/perf_event_paranoid
mkdir /home/benutzer/source/xserver-xorg-core/orig -p
cd /home/benutzer/source/xserver-xorg-core/orig
apt source xserver-xorg-core
cd xorg-server-1.20.8
mkdir x/x/x/x/x/x/x/x -p
cd
mkdir /home/benutzer/source/libunwind8/orig -p
cd /home/benutzer/source/libunwind8/orig
apt source libunwind8
cd
# apt install pstack
wget
https://snapshot.debian.org/archive/debian/20170317T095121Z/pool/main/p/pstack/pstack_1.3.1-1%2Bb1_amd64.deb
dpkg -i pstack_1.3.1-1+b1_amd64.deb
root@debian:~# pstack 37009
37009: mc -e ./os/backtrace.c
(No symbols found)
crawl: Input/output error
Error tracing through process 37009
0x7f2b9826e926: ????root@debian:~#
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=950168
/home/benutzer/obj/bin/rr gdb -q --args /usr/lib/xorg/Xorg
set width 0
set pagination off
b *dbus_error_is_set+7
run
display/i $pc
bt
print/x $rdi
set $rdi=0
detach
q
/home/benutzer/obj/bin/rr ps /root/.local/share/rr/gdb-7
/home/benutzer/obj/bin/rr replay --onfork=35233 --goto=3535
/root/.local/share/rr/gdb-7
set width 0
set pagination off
directory
/home/benutzer/source/xserver-xorg-core/orig/xorg-server-1.20.8/x/x/x/x
root@debian:~# /home/benutzer/obj/bin/rr gdb -q --args /usr/lib/xorg/Xorg
rr: Saving execution to trace directory `/root/.local/share/rr/gdb-7'.
Reading symbols from /usr/lib/xorg/Xorg...
Reading symbols from
/usr/lib/debug/.build-id/26/aa85549ea06b65d38b154de1bdd27e209ec5d3.debug...
(gdb) set width 0
(gdb) set pagination off
(gdb) b *dbus_error_is_set+7
Breakpoint 1 at 0x3e7a7
(gdb) run
Starting program: /usr/lib/xorg/Xorg
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
X.Org X Server 1.20.8
X Protocol Version 11, Revision 0
Build Operating System: Linux 4.19.0-8-amd64 x86_64 Debian
Current Operating System: Linux debian 5.8.0-2-amd64 #1 SMP Debian 5.8.10-1
(2020-09-19) x86_64
Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.8.0-2-amd64
root=UUID=c9e90f0f-a043-45af-bda9-4a7fb7b42490 ro quiet
Build Date: 31 March 2020 10:14:40AM
xorg-server 2:1.20.8-2 (https://www.debian.org/support)
Current version of pixman: 0.36.0
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sat Sep 26 10:47:23 2020
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
Breakpoint 1, 0x00007ffff7f77b37 in dbus_error_is_set
(error=error@entry=0x7fffffffe9d0) at ../../../dbus/dbus-errors.c:334
334 ../../../dbus/dbus-errors.c: Datei oder Verzeichnis nicht gefunden.
(gdb) display/i $pc
1: x/i $pc
=> 0x7ffff7f77b37 <dbus_error_is_set+7>: cmpq $0x0,(%rdi)
(gdb) bt
#0 0x00007ffff7f77b37 in dbus_error_is_set (error=error@entry=0x7fffffffe9d0)
at ../../../dbus/dbus-errors.c:334
#1 0x00007ffff7f7059c in internal_bus_get (type=DBUS_BUS_SYSTEM, private=0,
error=0x7fffffffe9d0) at ../../../dbus/dbus-bus.c:426
#2 0x0000555555609f8e in connect_to_bus () at
../../../../config/dbus-core.c:136
#3 0x000055555560a394 in dbus_core_init () at
../../../../config/dbus-core.c:228
#4 0x00005555555ef504 in InitOutput
(pScreenInfo=pScreenInfo@entry=0x5555557c2740 <screenInfo>, argc=argc@entry=1,
argv=argv@entry=0x7fffffffec08) at
../../../../../../hw/xfree86/common/xf86Init.c:384
#5 0x00005555555b26f4 in dix_main (argc=1, argv=0x7fffffffec08,
envp=<optimized out>) at ../../../../dix/main.c:193
#6 0x00007ffff70cbcca in __libc_start_main (main=0x55555559c700 <main>,
argc=1, argv=0x7fffffffec08, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffebf8) at ../csu/libc-start.c:308
#7 0x000055555559c73a in _start ()
(gdb) print/x $rdi
$1 = 0x7fffffffe9d0
(gdb) set $rdi=0
(gdb) detach
Detaching from program: /usr/lib/xorg/Xorg, process 35233
[Inferior 1 (process 35233) detached]
(gdb) (EE)
(EE) Backtrace:
(EE) 0: /usr/lib/xorg/Xorg (OsLookupColor+0x138) [0x55555570be88]
(EE) 1: /lib/x86_64-linux-gnu/libpthread.so.0 (funlockfile+0x50)
[0x7ffff727e18f]
(EE) 2: /lib/x86_64-linux-gnu/libdbus-1.so.3 (dbus_error_is_set+0x7)
[0x7ffff7f77b37]
(EE) 3: /lib/x86_64-linux-gnu/libdbus-1.so.3 (dbus_bus_register+0x28c)
[0x7ffff7f707ec]
(EE) 4: /usr/lib/xorg/Xorg (config_fini+0x1fe) [0x55555560a15e]
(EE) 5: /usr/lib/xorg/Xorg (config_fini+0x604) [0x55555560a964]
(EE) 6: /usr/lib/xorg/Xorg (InitOutput+0x6e4) [0x5555555ef504]
(EE) 7: /usr/lib/xorg/Xorg (InitFonts+0x1d4) [0x5555555b2734]
(EE) 8: /lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main+0xea)
[0x7ffff70cbcca]
(EE) 9: /usr/lib/xorg/Xorg (_start+0x2a) [0x55555559c73a]
(EE)
(EE) Segmentation fault at address 0x0
(EE)
Fatal server error:
(EE) Caught signal 11 (Segmentation fault). Server aborting
(EE)
(EE)
Please consult the The X.Org Foundation support
at http://wiki.x.org
for help.
(EE) Please also check the log file at "/var/log/Xorg.0.log" for additional
information.
(EE)
(EE) Server terminated with error (1). Closing log file.
q
root@debian:~# /home/benutzer/obj/bin/rr ps /root/.local/share/rr/gdb-7
PID PPID EXIT CMD
35230 -- 0 gdb -q --args /usr/lib/xorg/Xorg
35231 35230 0 iconv -l
35233 35230 -6 /bin/bash -c exec /usr/lib/xorg/Xorg
35234 35230 -9 (forked without exec)
35235 35234 -9 (forked without exec)
35236 35230 -9 (forked without exec)
/home/benutzer/obj/bin/rr replay --onfork=35233 --goto=10739
/root/.local/share/rr/gdb-7
set width 0
set pagination off
set backtrace past-main
directory
/home/benutzer/source/xserver-xorg-core/orig/xorg-server-1.20.8/x/x/x/x
directory
/home/benutzer/source/xserver-xorg-core/orig/xorg-server-1.20.8/x/x/x/x/x/x
directory
/home/benutzer/source/xserver-xorg-core/orig/xorg-server-1.20.8/x/x/x/x/x/x/x
directory /home/benutzer/source/libunwind8/orig/libunwind-1.3.2/src
directory /home/benutzer/source/libunwind8/orig/libunwind-1.3.2/src/x86_64
display/i $pc
b xorg_backtrace
cont
display/x pip.start_ip
(rr) bt
#0 _Ux86_64_getcontext () at x86_64/getcontext.S:43
#1 0x0000555555707efd in xorg_backtrace ()
#2 0x000055555570bd78 in ?? ()
#3 <signal handler called>
#4 0x00007ffff7f77b37 in dbus_error_is_set () from
/lib/x86_64-linux-gnu/libdbus-1.so.3
#5 0x00007ffff7f7059c in ?? () from /lib/x86_64-linux-gnu/libdbus-1.so.3
#6 0x0000555555609f8e in ?? ()
#7 0x000055555560a394 in ?? ()
#8 0x00005555555ef504 in InitOutput ()
#9 0x00005555555b26f4 in ?? ()
#10 0x00007ffff70cbcca in __libc_start_main (main=0x55555559c700, argc=1,
argv=0x7fffffffec08, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffebf8) at ../csu/libc-start.c:308
#11 0x000055555559c73a in _start ()
(EE) Backtrace:
(EE) 0: /usr/lib/xorg/Xorg (OsLookupColor+0x138) [0x55555570be88]
(EE) 1: /lib/x86_64-linux-gnu/libpthread.so.0 (funlockfile+0x50)
[0x7ffff727e18f]
(EE) 2: /lib/x86_64-linux-gnu/libdbus-1.so.3 (dbus_error_is_set+0x7)
[0x7ffff7f77b37]
(EE) 3: /lib/x86_64-linux-gnu/libdbus-1.so.3 (dbus_bus_register+0x28c)
[0x7ffff7f707ec]
(EE) 4: /usr/lib/xorg/Xorg (config_fini+0x1fe) [0x55555560a15e]
(EE) 5: /usr/lib/xorg/Xorg (config_fini+0x604) [0x55555560a964]
(EE) 6: /usr/lib/xorg/Xorg (InitOutput+0x6e4) [0x5555555ef504]
(EE) 7: /usr/lib/xorg/Xorg (InitFonts+0x1d4) [0x5555555b2734]
(EE) 8: /lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main+0xea)
[0x7ffff70cbcca]
(EE) 9: /usr/lib/xorg/Xorg (_start+0x2a) [0x55555559c73a]
(rr) bt
#0 0x00007ffff7dd223a in _Ux86_64_getcontext () at x86_64/getcontext.S:43
#1 0x0000555555707efd in xorg_backtrace () at ../../../../os/backtrace.c:56
#2 0x000055555570bd78 in OsSigHandler (unused=<optimized out>,
sip=0x7fffffffe4b0, signo=11) at ../../../../os/osinit.c:135
#3 0x000055555570bd78 in OsSigHandler (signo=11, sip=0x7fffffffe4b0,
unused=<optimized out>) at ../../../../os/osinit.c:110
#4 <signal handler called>
#5 0x00007ffff7f77b37 in dbus_error_is_set (error=0x0,
error@entry=0x7fffffffe9d0) at ../../../dbus/dbus-errors.c:334
#6 0x00007ffff7f7059c in internal_bus_get (type=DBUS_BUS_SYSTEM, private=0,
error=0x7fffffffe9d0) at ../../../dbus/dbus-bus.c:426
#7 0x0000555555609f8e in connect_to_bus () at
../../../../config/dbus-core.c:136
#8 0x000055555560a394 in dbus_core_init () at
../../../../config/dbus-core.c:228
#9 0x00005555555ef504 in InitOutput
(pScreenInfo=pScreenInfo@entry=0x5555557c2740 <screenInfo>, argc=argc@entry=1,
argv=argv@entry=0x7fffffffec08) at
../../../../../../hw/xfree86/common/xf86Init.c:384
#10 0x00005555555b26f4 in dix_main (argc=1, argv=0x7fffffffec08,
envp=<optimized out>) at ../../../../dix/main.c:193
#11 0x00007ffff70cbcca in __libc_start_main (main=0x55555559c700 <main>,
argc=1, argv=0x7fffffffec08, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffebf8) at ../csu/libc-start.c:308
#12 0x000055555559c73a in _start ()
(rr) reverse-finish
Run back to call of #0 _Uelf64_lookup_symbol (ip=ip@entry=93824994033015,
ei=ei@entry=0x7fffffffc8c0, load_offset=load_offset@entry=93824992231424,
buf=buf@entry=0x7fffffffe210 "OsLookupColor", buf_len=buf_len@entry=256,
min_dist=min_dist@entry=0x7fffffffc7e8, as=0x7ffff7ddf3c0 <local_addr_space>)
at elfxx.c:139
Breakpoint 4, _Uelf64_lookup_symbol (ip=ip@entry=93824994033015,
ei=ei@entry=0x7fffffffc8c0, load_offset=load_offset@entry=93824992231424,
buf=buf@entry=0x7fffffffe210 "OsLookupColor", buf_len=buf_len@entry=256,
min_dist=min_dist@entry=0x7fffffffc7e8, as=0x7ffff7ddf3c0 <local_addr_space>)
at elfxx.c:143
143 buf[buf_len - 1] = '\0';
1: x/i $pc
=> 0x7ffff7dd65ab <_Uelf64_lookup_symbol+347>: mov 0x18(%rsp),%r8
8: (char*)(strtab + sym->st_name) = 0x7ffff678f6d7 "OsLookupColor"
9: /x *min_dist = 0x137
10: /x val = <optimized out>
(rr) bt
#0 _Uelf64_lookup_symbol (ip=ip@entry=93824994033015,
ei=ei@entry=0x7fffffffc8c0, load_offset=load_offset@entry=93824992231424,
buf=buf@entry=0x7fffffffe210 "OsLookupColor", buf_len=buf_len@entry=256,
min_dist=min_dist@entry=0x7fffffffc7e8, as=0x7ffff7ddf3c0 <local_addr_space>)
at elfxx.c:143
#1 0x00007ffff7dd67bc in _Uelf64_get_proc_name_in_image
(as=as@entry=0x7ffff7ddf3c0 <local_addr_space>, ei=ei@entry=0x7fffffffc8c0,
segbase=<optimized out>, mapoff=<optimized out>, ip=ip@entry=93824994033015,
buf=buf@entry=0x7fffffffe210 "OsLookupColor", buf_len=256, offp=0x7fffffffd9c8)
at elfxx.c:282
#2 0x00007ffff7dd6dee in _Uelf64_get_proc_name (as=0x7ffff7ddf3c0
<local_addr_space>, pid=<optimized out>, ip=93824994033015, buf=0x7fffffffe210
"OsLookupColor", buf_len=256, offp=0x7fffffffd9c8) at elfxx.c:325
#3 0x00007ffff7dcf60c in get_proc_name (arg=0x7fffffffde10,
offp=0x7fffffffd9c8, buf_len=256, buf=0x7fffffffe210 "OsLookupColor",
ip=93824994033015, as=0x7ffff7ddf3c0 <local_addr_space>) at
mi/Gget_proc_name.c:93
#4 _ULx86_64_get_proc_name (cursor=cursor@entry=0x7fffffffde10,
buf=buf@entry=0x7fffffffe210 "OsLookupColor", buf_len=buf_len@entry=256,
offp=offp@entry=0x7fffffffd9c8) at mi/Gget_proc_name.c:111
#5 0x000055555570803b in xorg_backtrace () at ../../../../os/backtrace.c:82
#6 0x000055555570bd78 in OsSigHandler (unused=<optimized out>,
sip=0x7fffffffe4b0, signo=11) at ../../../../os/osinit.c:135
#7 OsSigHandler (signo=11, sip=0x7fffffffe4b0, unused=<optimized out>) at
../../../../os/osinit.c:110
#8 <signal handler called>
#9 0x00007ffff7f77b37 in dbus_error_is_set (error=0x0,
error@entry=0x7fffffffe9d0) at ../../../dbus/dbus-errors.c:334
#10 0x00007ffff7f7059c in internal_bus_get (type=DBUS_BUS_SYSTEM, private=0,
error=0x7fffffffe9d0) at ../../../dbus/dbus-bus.c:426
#11 0x0000555555609f8e in connect_to_bus () at
../../../../config/dbus-core.c:136
#12 0x000055555560a394 in dbus_core_init () at
../../../../config/dbus-core.c:228
#13 0x00005555555ef504 in InitOutput
(pScreenInfo=pScreenInfo@entry=0x5555557c2740 <screenInfo>, argc=argc@entry=1,
argv=argv@entry=0x7fffffffec08) at
../../../../../../hw/xfree86/common/xf86Init.c:384
#14 0x00005555555b26f4 in dix_main (argc=1, argv=0x7fffffffec08,
envp=<optimized out>) at ../../../../dix/main.c:193
#15 0x00007ffff70cbcca in __libc_start_main (main=0x55555559c700 <main>,
argc=1, argv=0x7fffffffec08, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffebf8) at ../csu/libc-start.c:308
#16 0x000055555559c73a in _start () at
../../../../../../hw/xfree86/dri2/dri2ext.c:659
8: (char*)(strtab + sym->st_name) = 0x7ffff678f6d7 "OsLookupColor"
9: /x *min_dist = 0x137
10: /x val = 0x55555570bc40
11: /x ip = 0x55555570bd77
(rr) list elfxx.c:143
138
139 if ((Elf_W (Addr)) (ip - val) < *min_dist)
140 {
141 *min_dist = (Elf_W (Addr)) (ip - val);
142 strncpy (buf, strtab + sym->st_name, buf_len);
143 buf[buf_len - 1] = '\0';
144 ret = (strlen (strtab + sym->st_name) >= buf_len
145 ? -UNW_ENOMEM : 0);
146 }
147 }
(rr) disassemble OsLookupColor,OsLookupColor+0x137+20
Dump of assembler code from 0x55555570bc40 to 0x55555570bd8b:
0x000055555570bc40 <OsLookupColor+0>: push %r15
0x000055555570bc42 <OsLookupColor+2>: mov $0xd6b,%edi
0x000055555570bc47 <OsLookupColor+7>: push %r14
0x000055555570bc49 <OsLookupColor+9>: mov $0x30d,%r14d
0x000055555570bc4f <OsLookupColor+15>: push %r13
0x000055555570bc51 <OsLookupColor+17>: mov %rsi,%r13
0x000055555570bc54 <OsLookupColor+20>: push %r12
0x000055555570bc56 <OsLookupColor+22>: mov %edx,%r12d
0x000055555570bc59 <OsLookupColor+25>: push %rbp
0x000055555570bc5a <OsLookupColor+26>: xor %ebp,%ebp
0x000055555570bc5c <OsLookupColor+28>: push %rbx
0x000055555570bc5d <OsLookupColor+29>: mov $0x30d,%ebx
0x000055555570bc62 <OsLookupColor+34>: sub $0x28,%rsp
0x000055555570bc66 <OsLookupColor+38>: mov %rcx,0x8(%rsp)
0x000055555570bc6b <OsLookupColor+43>: mov %r8,0x10(%rsp)
0x000055555570bc70 <OsLookupColor+48>: mov %r9,0x18(%rsp)
0x000055555570bc75 <OsLookupColor+53>: jmp 0x55555570bcb1
<OsLookupColor+113>
0x000055555570bc77 <OsLookupColor+55>: nopw 0x0(%rax,%rax,1)
0x000055555570bc80 <OsLookupColor+64>: mov %r15,%rdi
0x000055555570bc83 <OsLookupColor+67>: callq 0x5555555919d0
<strlen@plt>
0x000055555570bc88 <OsLookupColor+72>: cmp %r12,%rax
0x000055555570bc8b <OsLookupColor+75>: je 0x55555570bcf0
<OsLookupColor+176>
0x000055555570bc8d <OsLookupColor+77>: lea -0x1(%rbx),%r14d
0x000055555570bc91 <OsLookupColor+81>: cmp %r14d,%ebp
0x000055555570bc94 <OsLookupColor+84>: jg 0x55555570bcda
<OsLookupColor+154>
0x000055555570bc96 <OsLookupColor+86>: lea 0x0(%rbp,%r14,1),%ebx
0x000055555570bc9b <OsLookupColor+91>: lea 0x397be(%rip),%rcx
# 0x555555745460 <BuiltinColors>
0x000055555570bca2 <OsLookupColor+98>: mov %ebx,%eax
0x000055555570bca4 <OsLookupColor+100>: sar %eax
0x000055555570bca6 <OsLookupColor+102>: cltq
0x000055555570bca8 <OsLookupColor+104>: lea (%rax,%rax,2),%rax
0x000055555570bcac <OsLookupColor+108>: movzwl 0x4(%rcx,%rax,2),%edi
0x000055555570bcb1 <OsLookupColor+113>: lea 0x3aa08(%rip),%rax
# 0x5555557466c0 <BuiltinColorNames>
0x000055555570bcb8 <OsLookupColor+120>: mov %r12,%rdx
0x000055555570bcbb <OsLookupColor+123>: mov %r13,%rsi
0x000055555570bcbe <OsLookupColor+126>: sar %ebx
0x000055555570bcc0 <OsLookupColor+128>: lea (%rax,%rdi,1),%r15
0x000055555570bcc4 <OsLookupColor+132>: mov %r15,%rdi
0x000055555570bcc7 <OsLookupColor+135>: callq 0x5555555922a0
<strncasecmp@plt>
0x000055555570bccc <OsLookupColor+140>: test %eax,%eax
0x000055555570bcce <OsLookupColor+142>: je 0x55555570bc80
<OsLookupColor+64>
0x000055555570bcd0 <OsLookupColor+144>: jns 0x55555570bc8d
<OsLookupColor+77>
0x000055555570bcd2 <OsLookupColor+146>: lea 0x1(%rbx),%ebp
0x000055555570bcd5 <OsLookupColor+149>: cmp %r14d,%ebp
0x000055555570bcd8 <OsLookupColor+152>: jle 0x55555570bc96
<OsLookupColor+86>
0x000055555570bcda <OsLookupColor+154>: add $0x28,%rsp
0x000055555570bcde <OsLookupColor+158>: xor %eax,%eax
0x000055555570bce0 <OsLookupColor+160>: pop %rbx
0x000055555570bce1 <OsLookupColor+161>: pop %rbp
0x000055555570bce2 <OsLookupColor+162>: pop %r12
0x000055555570bce4 <OsLookupColor+164>: pop %r13
0x000055555570bce6 <OsLookupColor+166>: pop %r14
0x000055555570bce8 <OsLookupColor+168>: pop %r15
0x000055555570bcea <OsLookupColor+170>: retq
0x000055555570bceb <OsLookupColor+171>: nopl 0x0(%rax,%rax,1)
0x000055555570bcf0 <OsLookupColor+176>: movslq %ebx,%rbx
0x000055555570bcf3 <OsLookupColor+179>: lea 0x39766(%rip),%rax
# 0x555555745460 <BuiltinColors>
0x000055555570bcfa <OsLookupColor+186>: mov 0x8(%rsp),%rsi
0x000055555570bcff <OsLookupColor+191>: lea (%rbx,%rbx,2),%rdx
0x000055555570bd03 <OsLookupColor+195>: lea (%rax,%rdx,2),%rax
0x000055555570bd07 <OsLookupColor+199>: movzbl (%rax),%ecx
0x000055555570bd0a <OsLookupColor+202>: mov %ecx,%edx
0x000055555570bd0c <OsLookupColor+204>: shl $0x8,%edx
0x000055555570bd0f <OsLookupColor+207>: add %ecx,%edx
0x000055555570bd11 <OsLookupColor+209>: movzbl 0x1(%rax),%ecx
0x000055555570bd15 <OsLookupColor+213>: mov %dx,(%rsi)
0x000055555570bd18 <OsLookupColor+216>: mov 0x10(%rsp),%rsi
0x000055555570bd1d <OsLookupColor+221>: mov %ecx,%edx
0x000055555570bd1f <OsLookupColor+223>: shl $0x8,%edx
0x000055555570bd22 <OsLookupColor+226>: add %ecx,%edx
0x000055555570bd24 <OsLookupColor+228>: mov %dx,(%rsi)
0x000055555570bd27 <OsLookupColor+231>: movzbl 0x2(%rax),%edx
0x000055555570bd2b <OsLookupColor+235>: mov 0x18(%rsp),%rsi
0x000055555570bd30 <OsLookupColor+240>: mov %edx,%eax
0x000055555570bd32 <OsLookupColor+242>: shl $0x8,%eax
0x000055555570bd35 <OsLookupColor+245>: add %edx,%eax
0x000055555570bd37 <OsLookupColor+247>: mov %ax,(%rsi)
0x000055555570bd3a <OsLookupColor+250>: add $0x28,%rsp
0x000055555570bd3e <OsLookupColor+254>: mov $0x1,%eax
0x000055555570bd43 <OsLookupColor+259>: pop %rbx
0x000055555570bd44 <OsLookupColor+260>: pop %rbp
0x000055555570bd45 <OsLookupColor+261>: pop %r12
0x000055555570bd47 <OsLookupColor+263>: pop %r13
0x000055555570bd49 <OsLookupColor+265>: pop %r14
0x000055555570bd4b <OsLookupColor+267>: pop %r15
0x000055555570bd4d <OsLookupColor+269>: retq
0x000055555570bd4e: xchg %ax,%ax
0x000055555570bd50 <OsSigHandler+0>: mov 0xab979(%rip),%rax #
0x5555557b76d0 <OsSigWrapper>
0x000055555570bd57 <OsSigHandler+7>: push %r13
0x000055555570bd59 <OsSigHandler+9>: push %r12
0x000055555570bd5b <OsSigHandler+11>: mov %edi,%r12d
0x000055555570bd5e <OsSigHandler+14>: push %rbx
0x000055555570bd5f <OsSigHandler+15>: mov %rsi,%rbx
0x000055555570bd62 <OsSigHandler+18>: test %rax,%rax
0x000055555570bd65 <OsSigHandler+21>: je 0x55555570bd73
<OsSigHandler+35>
0x000055555570bd67 <OsSigHandler+23>: callq *%rax
0x000055555570bd69 <OsSigHandler+25>: test %eax,%eax
0x000055555570bd6b <OsSigHandler+27>: jne 0x55555570bd73
<OsSigHandler+35>
0x000055555570bd6d <OsSigHandler+29>: pop %rbx
0x000055555570bd6e <OsSigHandler+30>: pop %r12
0x000055555570bd70 <OsSigHandler+32>: pop %r13
0x000055555570bd72 <OsSigHandler+34>: retq
0x000055555570bd73 <OsSigHandler+35>: callq 0x555555707ec0
<xorg_backtrace>
0x000055555570bd78 <OsSigHandler+40>: cmpl $0x0,0x8(%rbx)
0x000055555570bd7c <OsSigHandler+44>: je 0x55555570bde5
<OsSigHandler+149>
0x000055555570bd7e <OsSigHandler+46>: cmp $0xb,%r12d
0x000055555570bd82 <OsSigHandler+50>: ja 0x55555570bdb6
<OsSigHandler+102>
0x000055555570bd84 <OsSigHandler+52>: mov $0x1,%eax
0x000055555570bd89 <OsSigHandler+57>: mov %r12d,%ecx
End of assembler dump.
--> unw_get_proc_name finds the nearest symbol "OsLookupColor" at 0x55555570bc40
and uses that address for min_dist calculation
.
(rr) bt
#0 xorg_backtrace () at ../../../../os/backtrace.c:97
#1 0x000055555570bd78 in OsSigHandler (unused=<optimized out>,
sip=0x7fffffffe4b0, signo=11) at ../../../../os/osinit.c:135
#2 OsSigHandler (signo=11, sip=0x7fffffffe4b0, unused=<optimized out>) at
../../../../os/osinit.c:110
#3 <signal handler called>
#4 0x00007ffff7f77b37 in dbus_error_is_set (error=0x0,
error@entry=0x7fffffffe9d0) at ../../../dbus/dbus-errors.c:334
#5 0x00007ffff7f7059c in internal_bus_get (type=DBUS_BUS_SYSTEM, private=0,
error=0x7fffffffe9d0) at ../../../dbus/dbus-bus.c:426
#6 0x0000555555609f8e in connect_to_bus () at
../../../../config/dbus-core.c:136
#7 0x000055555560a394 in dbus_core_init () at
../../../../config/dbus-core.c:228
#8 0x00005555555ef504 in InitOutput
(pScreenInfo=pScreenInfo@entry=0x5555557c2740 <screenInfo>, argc=argc@entry=1,
argv=argv@entry=0x7fffffffec08) at
../../../../../../hw/xfree86/common/xf86Init.c:384
#9 0x00005555555b26f4 in dix_main (argc=1, argv=0x7fffffffec08,
envp=<optimized out>) at ../../../../dix/main.c:193
#10 0x00007ffff70cbcca in __libc_start_main (main=0x55555559c700 <main>,
argc=1, argv=0x7fffffffec08, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffebf8) at ../csu/libc-start.c:308
#11 0x000055555559c73a in _start () at
../../../../../../hw/xfree86/dri2/dri2ext.c:659
(rr) list backtrace.c:97
file: "../../../../os/backtrace.c", line number: 97, symbol: "???"
92 *dlinfo.dli_fname)
93 filename = dlinfo.dli_fname;
94 else
95 filename = "?";
96
97 ErrorFSigSafe("%u: %s (%s%s+0x%x) [%p]\n", i++, filename,
procname,
98 ret == -UNW_ENOMEM ? "..." : "", (int)off,
99 (void *)(uintptr_t)(pip.start_ip + off));
100
101 ret = unw_step(&cursor);
(rr) print/x pip.start_ip
$56 = 0x55555570bd50
(rr) print/x off
$57 = 0x138
(rr) print/x pip.start_ip + off
$58 = 0x55555570be88
(rr) disassemble 0x55555570be88-0x30,0x55555570be88+16
Dump of assembler code from 0x55555570be58 to 0x55555570be98:
0x000055555570be58 <OsInit+72>: and $0x14,%al
0x000055555570be5a <OsInit+74>: add (%rax),%eax
0x000055555570be5c <OsInit+76>: add %al,(%rax)
0x000055555570be5e <OsInit+78>: mov %rax,0x18(%rsp)
0x000055555570be63 <OsInit+83>: mov $0x3,%ebx
0x000055555570be68 <OsInit+88>: lea 0x40(%rsp),%r13
0x000055555570be6d <OsInit+93>: movabs $0x600000007,%rax
0x000055555570be77 <OsInit+103>: mov %rax,0x20(%rsp)
0x000055555570be7c <OsInit+108>: mov $0xb,%r12d
0x000055555570be82 <OsInit+114>: movabs $0x180000001f,%rax
0x000055555570be8c <OsInit+124>: lea 0xe0(%rsp),%r14
0x000055555570be94 <OsInit+132>: mov %rax,0x28(%rsp)
End of assembler dump.
--> But in xorg_backtrace that offset is used and added to the function start
provided in pip.start_ip,
which is the correct start for OsSigHandler.
Therefore the value printed in [] is wrong.
https://wiki.debian.org/UsingQuilt
quilt push -a
quilt new 08_backtrace.diff
quilt add os/backtrace.c
# edit
quilt refresh
quilt header -e
dpkg-buildpackage
With a package installed with the patch:
root@debian:~# gdb -q --args /usr/lib/xorg/Xorg
Reading symbols from /usr/lib/xorg/Xorg...
Reading symbols from
/usr/lib/debug/.build-id/41/5c140ca4d894df5e39193499076eed502b26e9.debug...
(gdb) set width 0
(gdb) set pagination off
(gdb) b *dbus_error_is_set+7
Breakpoint 1 at 0x3e7d7
(gdb) run
Starting program: /usr/lib/xorg/Xorg
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
X.Org X Server 1.20.8
X Protocol Version 11, Revision 0
Build Operating System: Linux 5.8.0-2-amd64 x86_64 Debian
Current Operating System: Linux debian 5.8.0-2-amd64 #1 SMP Debian 5.8.10-1
(2020-09-19) x86_64
Kernel command line: BOOT_IMAGE=/boot/vmlinuz-5.8.0-2-amd64
root=UUID=c9e90f0f-a043-45af-bda9-4a7fb7b42490 ro quiet
Build Date: 31 March 2020 10:14:40AM
xorg-server 2:1.20.8-2 (https://www.debian.org/support)
Current version of pixman: 0.36.0
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sun Sep 27 18:15:31 2020
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
Breakpoint 1, 0x00007ffff7f85b37 in dbus_error_is_set
(error=error@entry=0x7fffffffead0) at ../../../dbus/dbus-errors.c:334
334 ../../../dbus/dbus-errors.c: Datei oder Verzeichnis nicht gefunden.
(gdb) display/i $pc
1: x/i $pc
=> 0x7ffff7f85b37 <dbus_error_is_set+7>: cmpq $0x0,(%rdi)
(gdb) bt
#0 0x00007ffff7f85b37 in dbus_error_is_set (error=error@entry=0x7fffffffead0)
at ../../../dbus/dbus-errors.c:334
#1 0x00007ffff7f7e59c in internal_bus_get (type=DBUS_BUS_SYSTEM, private=0,
error=0x7fffffffead0) at ../../../dbus/dbus-bus.c:426
#2 0x000055555560c64e in connect_to_bus () at
../../../../config/dbus-core.c:136
#3 0x000055555560ca45 in dbus_core_init () at
../../../../config/dbus-core.c:228
#4 0x00005555555f158f in InitOutput
(pScreenInfo=pScreenInfo@entry=0x5555557b40a0 <screenInfo>, argc=argc@entry=1,
argv=argv@entry=0x7fffffffed08) at
../../../../../../hw/xfree86/common/xf86Init.c:384
#5 0x00005555555b335c in dix_main (argc=1, argv=0x7fffffffed08,
envp=<optimized out>) at ../../../../dix/main.c:193
#6 0x00007ffff70d9cca in __libc_start_main (main=0x55555559cca0 <main>,
argc=1, argv=0x7fffffffed08, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffecf8) at ../csu/libc-start.c:308
#7 0x000055555559ccda in _start ()
(gdb) print/x $rdi
$1 = 0x7fffffffead0
(gdb) set $rdi=0
(gdb) b xorg_backtrace
Breakpoint 2 at 0x55555570eb80: file ../../../../os/backtrace.c, line 45.
(gdb) cont
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7f85b37 in dbus_error_is_set (error=0x0, error@entry=0x7fffffffead0)
at ../../../dbus/dbus-errors.c:334
334 in ../../../dbus/dbus-errors.c
1: x/i $pc
=> 0x7ffff7f85b37 <dbus_error_is_set+7>: cmpq $0x0,(%rdi)
(gdb) cont
Continuing.
Breakpoint 2, xorg_backtrace () at ../../../../os/backtrace.c:45
45 ../../../../os/backtrace.c: Datei oder Verzeichnis nicht gefunden.
1: x/i $pc
=> 0x55555570eb80 <xorg_backtrace>: push %r15
(gdb) next
56 in ../../../../os/backtrace.c
1: x/i $pc
=> 0x55555570eba4 <xorg_backtrace+36>: lea 0x80(%rsp),%r13
(gdb)
57 in ../../../../os/backtrace.c
1: x/i $pc
=> 0x55555570ebb5 <xorg_backtrace+53>: mov %r13,%rdi
(gdb)
58 in ../../../../os/backtrace.c
1: x/i $pc
=> 0x55555570ebbd <xorg_backtrace+61>: test %eax,%eax
(gdb)
64 in ../../../../os/backtrace.c
1: x/i $pc
=> 0x55555570ebc5 <xorg_backtrace+69>: lea 0x450(%rsp),%rbp
(gdb)
65 in ../../../../os/backtrace.c
1: x/i $pc
=> 0x55555570ebdb <xorg_backtrace+91>: test %eax,%eax
(gdb)
71 in ../../../../os/backtrace.c
1: x/i $pc
=> 0x55555570ebe3 <xorg_backtrace+99>: lea 0x3a752(%rip),%rdi #
0x55555574933c
(gdb)
(EE)
72 in ../../../../os/backtrace.c
1: x/i $pc
=> 0x55555570ebf6 <xorg_backtrace+118>: lea 0x3d1eb(%rip),%rdi #
0x55555574bde8
(gdb)
(EE) Backtrace:
73 in ../../../../os/backtrace.c
1: x/i $pc
=> 0x55555570ec09 <xorg_backtrace+137>: mov %rbp,%rdi
(gdb) bt
#0 xorg_backtrace () at ../../../../os/backtrace.c:73
#1 0x0000555555712a15 in OsSigHandler (unused=<optimized out>,
sip=0x7fffffffe5b0, signo=11) at ../../../../os/osinit.c:135
#2 OsSigHandler (signo=11, sip=0x7fffffffe5b0, unused=<optimized out>) at
../../../../os/osinit.c:110
#3 <signal handler called>
#4 0x00007ffff7f85b37 in dbus_error_is_set (error=0x0,
error@entry=0x7fffffffead0) at ../../../dbus/dbus-errors.c:334
#5 0x00007ffff7f7e59c in internal_bus_get (type=DBUS_BUS_SYSTEM, private=0,
error=0x7fffffffead0) at ../../../dbus/dbus-bus.c:426
#6 0x000055555560c64e in connect_to_bus () at
../../../../config/dbus-core.c:136
#7 0x000055555560ca45 in dbus_core_init () at
../../../../config/dbus-core.c:228
#8 0x00005555555f158f in InitOutput
(pScreenInfo=pScreenInfo@entry=0x5555557b40a0 <screenInfo>, argc=argc@entry=1,
argv=argv@entry=0x7fffffffed08) at
../../../../../../hw/xfree86/common/xf86Init.c:384
#9 0x00005555555b335c in dix_main (argc=1, argv=0x7fffffffed08,
envp=<optimized out>) at ../../../../dix/main.c:193
#10 0x00007ffff70d9cca in __libc_start_main (main=0x55555559cca0 <main>,
argc=1, argv=0x7fffffffed08, init=<optimized out>, fini=<optimized out>,
rtld_fini=<optimized out>, stack_end=0x7fffffffecf8) at ../csu/libc-start.c:308
#11 0x000055555559ccda in _start ()
(gdb) finish
Run till exit from #0 xorg_backtrace () at ../../../../os/backtrace.c:73
(EE) 0: /usr/lib/xorg/Xorg (OsLookupColor+0x135) [0x555555712a15]
(EE) 1: /lib/x86_64-linux-gnu/libpthread.so.0 (funlockfile+0x50)
[0x7ffff728e140]
(EE) 2: /lib/x86_64-linux-gnu/libdbus-1.so.3 (dbus_error_is_set+0x7)
[0x7ffff7f85b37]
(EE) 3: /lib/x86_64-linux-gnu/libdbus-1.so.3 (dbus_bus_register+0x28c)
[0x7ffff7f7e59c]
(EE) 4: /usr/lib/xorg/Xorg (config_fini+0x25e) [0x55555560c64e]
(EE) 5: /usr/lib/xorg/Xorg (config_fini+0x655) [0x55555560ca45]
(EE) 6: /usr/lib/xorg/Xorg (InitOutput+0x6df) [0x5555555f158f]
(EE) 7: /usr/lib/xorg/Xorg (InitFonts+0x1cc) [0x5555555b335c]
(EE) 8: /lib/x86_64-linux-gnu/libc.so.6 (__libc_start_main+0xea)
[0x7ffff70d9cca]
(EE) 9: /usr/lib/xorg/Xorg (_start+0x2a) [0x55555559ccda]
(EE)
--> Addresses in backtraces are the same.
--- End Message ---