2014-05-21 6 views
16

Ich möchte die x86-Assembly-Ausgabe des Standard-Go-Compilers untersuchen, um zu sehen, ob mein Code wirklich in einigermaßen effizienten Assemblercode umgewandelt wird; hoffentlich könnte ich durch das Profilieren und Untersuchen der Assembly-Ausgabe einen Hinweis bekommen, wo/wie ich meinen Go-Code für maximale Leistung umschreiben sollte. Aber wenn ich den Code mit der -S-Flagge untersuche, spuckt Go ein Chaos aus! Ich würde zwei Dinge mag:Leicht zu lesende Golang-Baugruppenausgabe?

  1. Gibt es eine Möglichkeit die Go-Compiler-Dump die Assembly Ausgabe in eine Datei zu machen, nicht einfach auf Terminal ausdrucken?

  2. Gibt es auch eine Möglichkeit, den Go-Compiler den Assemblercode in separate Funktionen mit Beschriftungen zu trennen? Ich weiß, dass einige Funktionen inline sein können und daher nicht im Assembler-Code erscheinen. Was ich sehe, ist nur ein homogener Zusammenbau, der fast unmöglich zu verstehen ist.

+5

1) Was ist mit '' 'oder was auch immer Ihre Befehlsshell unterstützt, um die Ausgabe eines Befehls in eine Datei umzuleiten? – Michael

+1

Auch Ihre Vorgehensweise beim Profiling mit Blick auf den Assemblercode ist möglicherweise nicht die produktivste. Haben Sie sich die für Go-Code verfügbaren Profiling-Tools angesehen? (z. B. http://blog.golang.org/profiling-go-programs) – Michael

+1

Ich stimme Ihnen zu, Montage-Ausgabe benötigt einige Verbesserungen. Das Problem besteht darin, dass der Go-Compiler keine tatsächliche Assembly generiert. Es erzeugt etwas, das viel wie Assembly aussieht, aber eine Menge Pseudo-Anweisungen enthält, die vom Linker erweitert werden.Erst nach der Verlinkung wird die eigentliche Montage hergestellt (und sofort montiert). – fuz

Antwort

18
  1. Sie können die Ausgabe in eine Datei wie folgt umgeleitet:

    go tool 6g -S file.go > file.s 
    
  2. Sie können die Optimierung mit N deaktivieren:

    go tool 6g -S -N file.go 
    

Alternativ Sie können gccgo verwenden:

gccgo -S -O0 -masm=intel test.go 

, die tests.s. Sie können mit den Optionen -O0/1/2/3 spielen, um die verschiedenen Optimierungen zu sehen.

+0

Danke! Die Verwendung von GCCGO ist eine gute Idee. – Gautam

+1

'go build -gcflags -S test.go> test.s' sollte auch funktionieren (nach https://golang.org/doc/asm) – rkusa

+4

' go tool comile -S datei.go> datei.S' seit 'go1.5' –

14

Ich empfehle nicht, die Ausgabe von -S zu verwenden, da der Go-Linker einiges ändern kann, was in den Objektcode geschrieben wird. Es gibt Ihnen eine Vorstellung davon, was vor sich geht.

Der Go-Assembler-Ausgang ist auch nicht-Standard.

Wenn ich dies tun möchte, verwende ich immer objdump, die Ihnen eine schöne Standard-Assembler-Ausgabe geben wird.

Eg für x86/amd64

objdump -d executable > disassembly 

Und für ARM (um die Registernamen zu erhalten die gleiche sein wie Go verwendet)

objdump -M reg-names-raw -d executable > disassembly 
8

Run go tool objdump auf die resultierende ausführbare Datei.

Um die Ausgabe auf interessante Funktionen zu beschränken, verwenden Sie die Option -s.

Verwandte Themen