[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [HS]backtrace amd64



On Mon, 16 May 2011 22:23:59 +0200
François Boisson <user.anti-spam@maison.homelinux.net> wrote:

> Le Mon, 16 May 2011 08:20:38 +0200
> François Boisson <user.anti-spam@maison.homelinux.net> a écrit:
> 
> > Merci de la réponse, je vais éplucher le code de backtrace.
> 
> Pour info, le code est dans les sources de gcc (voir
> gcc-4.4.5/gcc/unwind.inc etgcc-4.4.5/gcc/config/ia64/unwind-ia64.c )

Ca m'étonnerait que ce soit le code de backtrace fournie par la glibc,
car la fonction backtrace est dans la Glibc et elle marche même pour du
code compilé par autre chose que gcc (par exemple tinycc ou clang). Par
contre, certaines optimisations du compilateur (par exemple
-fomit-frame-pointer ou bien l'optimisation des appels récursifs
terminaux) suppriment la génération du code et de l'information
nécessaires au fonctionnement de la fonction backtrace.

La fonction backtrace est dépendante du processeur (et aussi des
optimisations du compilateur).
http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/i386/backtrace.c;h=cf3b2719b9e95fef1dc237e8e6429a81581294af;hb=HEAD
pour le i386 (32 bits) et
http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/ia64/backtrace.c;h=d4ff29102261505da02e785433197c0518cd110b;hb=HEAD
pour le Itanium ia64 et le AMD x86-64 (64 bits). Bizarrement,
l'agencement des cadres de pile est suffisamment proche sur ces deux
processeurs très différents pour qu'ils puissent partager le code de
backtrace

Voir aussi http://www.nongnu.org/libunwind/

En gros, la fonction backtrace est rarement utilisée, et elle ne marche
pas si bien que ça en pratique (en particulier, sa fonction soeur
backtrace_symbols imprime désagréablement les addresses des fonctions
actives). Certains programmes (peut-être l'interprète python) fork() un
gdb sur le processur courant pour avoir l'équivalent.

Par contre, certains programmes introspectifs gagnent à l'utiliser. Le
lecteur curieux pourrait par exemple se reporter au livre Artificial
Beings de Jacques Pitrat
http://www.iste.co.uk/index.php?f=a&ACTION=View&id=257 (et notamment
l'annexe). Il se trouve que le système CAIA de Pitrat n'utilise pas la
fonction backtrace, mais a ses propres piles, notamment pour avoir un
fonctionnement plus sûr et plus portable de la fonctionalité de
backtrace.

Java fournit la classe CallStack, voir par exemple
http://www.seas.upenn.edu/~sweirich/tdj/tutorial/Example9_CallStackIntrospection.htm 

Scheme a bien évidemment ses continuations (call/cc) mais c'est moins
introspectif.

En se fatiguant, on peut coder un traiteur de signal (machine
dépendant) qui fait des choses similaires.

Cordialement

-- 
Basile STARYNKEVITCH         http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mine, sont seulement les miennes} ***


Reply to: