2016-05-13 5 views
1

Ich benutze Systemtap, um einen Callgraph mit Parametern und Rückgabewerte zu erhalten, aber float und Doppelvariablen werden angezeigt als? verkohlen. Gibt es eine Möglichkeit, den richtigen Wert zu zeigen?

Mein systemtap Skript ist dies:

#! /usr/bin/env stap 

probe $1.call { trace(1, $$parms$$) } 
probe $1.return { trace(-1, $$return$$) } 

Und ein einfacher C-Programm-Code zu testen:

double test(int a, char b, double c, float e){ 
    return c; 
} 

int main(void){ 
    test(1,'1',1.0,1.0f); 
    return 0; 
} 

Die Ausgabe des Skripts über den Code ausgeführt wird (die c und e-Werte beachten, und die Testrückgabe):

test a=1 b='1' c=? e=? 
test return=? 
main 
main return=0 

Antwort

2

Systemtap unterstützt derzeit Gleitkommawerte nativ nicht (main weil Gleitkommaoperationen im Kernel-Kontext nicht erlaubt sind. Siehe auch https://sourceware.org/bugzilla/show_bug.cgi?id=13838 und https://sourceware.org/bugzilla/show_bug.cgi?id=13832.

Eine ungeschickte Abhilfe könnte so etwas wie

probe process("a.out").function("test") { 
    hexdump = sprintf("%.*M", 4, & $e) 
} 

oder ähnlich sein, user_int(& $e) mit Zugriff auf den Wert Gleitkommazahlen zu bekommen, als ob es eine ganze Zahl war. Rendering in Dezimalform ist ein separates Problem, aber auch nur die Mantisse/Exponenten durch Skriptsprache Funktionen trennen könnte etwas sein.