[linux] segmentation fault wanneer ik pan wil gebruiken met hint van gdb-output (lang)

Daniel C. von Asmuth asmuth op bakunin.xs4all.nl
Do Nov 28 19:56:57 CET 2019


Aldus schreef Julien Michielsen op Thu, Nov 28, 2019 at 07:32:42PM +0100:
> Paul Slootman schreef op 28-11-2019 14:43:
> > On Thu 28 Nov 2019, Julien Michielsen wrote:
> 
> gdb was al geïnstalleerd. Het draaien van pan onder gdb gaf een extra
> melding, die ik voorheen niet gezien heb.  Mijn OS is Ubuntu 18,4.3,
> en pan 0.144
> De output van gdb pan r : (met helemaal onderin de "nieuwe melding":
> julien op notebook:~$ gdb pan
> GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
> Copyright (C) 2018 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "x86_64-linux-gnu".
> Type "show configuration" for configuration details.
> For bug reporting instructions, please see:
> <http://www.gnu.org/software/gdb/bugs/>.
> Find the GDB manual and other documentation resources online at:
> <http://www.gnu.org/software/gdb/documentation/>.
> For help, type "help".
> Type "apropos word" to search for commands related to "word"...
> Reading symbols from pan...(no debugging symbols found)...done.
> (gdb) r
> Starting program: /usr/bin/pan
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
> [New Thread 0x7fffeab38700 (LWP 6596)]
> [New Thread 0x7fffea337700 (LWP 6597)]
> [New Thread 0x7fffe3fff700 (LWP 6598)]
> [New Thread 0x7fffe37fe700 (LWP 6599)]
> [New Thread 0x7fffe2ffd700 (LWP 6600)]
> [New Thread 0x7fffe27fc700 (LWP 6601)]
> [New Thread 0x7fffe1ffb700 (LWP 6602)]
> GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name news.pan.NZB
> was not provided by any .service files

Wat zou bovenstaande fout kunnen veroorzaken?

> [New Thread 0x7fffe0ff8700 (LWP 6603)]
> [Thread 0x7fffe0ff8700 (LWP 6603) exited]
> [Thread 0x7fffe1ffb700 (LWP 6602) exited]
> [New Thread 0x7fffe1ffb700 (LWP 6608)]
> !!!!
> Hier komt de aankondiging van de Segmentation fault, vergezeld van
> de reden waarom: "at strftime l.c:560
> <_nl_global_locale>)
> 560	strftime_l.c: No such file or director
> !!!!

Broncode debuggen vereist helaas wat vaardigheid. Bovenstaande zegt gewoon dat 
'Pan' vastliep in regel 560 van het bestand strftime_l.c en vervolgens dat de
debugger de bijbehorende broncode niet heeft kunnen vinden. Google vindt die
file wel, maar het zou een andere versie kunnen zijn!
	https://code.woboq.org/userspace/glibc/time/strftime_l.c.html

Op regel 560 staat:
 	for (f = format; *f != '\0'; ++f)
Nu lijkt dit op een niet-getermineerde string, of misschien is 'format' wel een
NULL-pointer.

> Thread 1 "pan" received signal SIGSEGV, Segmentation fault.
> __strftime_internal (s=0x7fffffffba00 "@\033\212\364\377\177", maxsize=100,
> format=0x0, tp=0x7fffffffb9c0,
> tzset_called=tzset_called op entry=0x7fffffffb967, loc=0x7ffff48a5560
> <_nl_global_locale>)
>     at strftime_l.c:560
> 560	strftime_l.c: No such file or directory.

De fout treedt op in de functie strftime_internal(), gedefinieerd als:
static size_t
__strftime_internal (CHAR_T *s, size_t maxsize, const CHAR_T *format,
                     const struct tm *tp, int yr_spec, bool *tzset_called
			ut_argument_spec LOCALE_PARAM)
> (gdb) quit

Dit klinkt onduidelijk. Gelukkig is er een goede man page voor de strftime() 
functie op http://man7.org/linux/man-pages/man3/strftime.3.html

       size_t strftime(char *s, size_t max, const char *format,
                       const struct tm *tm);

DESCRIPTION
       The strftime() function formats the broken-down time tm according
       to the format specification format and places the result  in  the
       character array s of size max.

       The format specification is a null-terminated string and may con‐
       tain special character  sequences  called  conversion  specifica‐
       tions,  each of which is introduced by a '%' character and termi‐
       nated by some other character known  as  a  conversion  specifier
       character.   All other character sequences are ordinary character
       sequences.

> Mogelijk zit het hem erin dat mijn locals slecht gedefinieerd zijn.

Locals? Locales? 

> Of mogelijk zit er meer ** aan de knikker ...
> Iemand een hint hoe verder te gaan?

De eerste stap is om gdb te vragen welke argumenten de aanroepende functie 
heeft meegekregen. De volgende stap is om de stack af te lopen om te
zoeken naar welke glibc functie is aangeroepen door de code van Pan (we
kunnen het antwoord raden) en met welke parameters (interessanter). Daarna
moet je de broncode van Pan erbij zoeken.

> Dank
> Julien
> 
> -- 
> Julien Michielsen
> julien op michkloo.xs4all.nl


Suc6,



Daniel

-- 
	
		if at first you don't succeed
		keep rubbing till your fingers bleed
		


Meer informatie over de Linux maillijst