2014-05-21 33 views
16

Kodumun gerçekten verimli bir şekilde derlenmiş bir montaj koduna dönüştürülüp dönüştürülmediğini görmek için standart Go derleyicinin x86 montaj çıktısını incelemek istiyorum; umarım, montaj çıktısını profilleme ve inceleyerek, Go kodumu maksimum performans için nereye/nasıl yazmalıyım konusunda bir ipucu verebilirim. Ama kodu -S bayrağı kullanarak incelediğimde, Go bir dağınıklık yayıyor!Golang montaj çıktısını okumak kolay mı?

  1. Git derleyici sadece Terminal üzerinde çıktısını değil, bir dosya içine montaj çıkış dökümü yapmak için bir yolu var mı: İki şey istiyorum?

  2. Ayrıca, Go derleyicisini derleme kodunu ayrı işlevler olarak etiketlerle ayırmanın bir yolu var mı? Bazı işlevlerin kodlanmış olabileceğini biliyorum ve bu nedenle montaj kodunda görünmeyebilir. Gördüğüm şey, anlaşılması neredeyse imkansız olan, homojen bir montaj bloğu.

+5

1) '>' komutunu kullanma veya komut kabuğunun desteğini ne olursa olsun, bir komutun çıktısını bir dosyaya yönlendirmek için ne yapmalı? – Michael

+1

Ayrıca, montaj koduna bakarak profilleme yaklaşımınız en verimli olanı olmayabilir. Go kodu için mevcut profil araçlarına baktınız mı? (örn. http://blog.golang.org/profiling-go-programs) – Michael

+1

Size katılıyorum, montaj çıktısının biraz iyileştirilmesi gerekiyor. Sorun, Go derleyicisinin gerçek montaj oluşturmamasıdır. Montaja çok benzeyen ancak bağlayıcı tarafından genişletilecek çok sayıda sözde talimat içeren bir şey üretir.Sadece bağlantı yapıldıktan sonra, gerçek montaj üretilir (ve hemen monte edilir). – fuz

cevap

18
  1. Böyle bir dosyaya çıktı yönlendirebilirsiniz:

    go tool 6g -S file.go > file.s 
    
  2. Sen -N optimizasyonu devre dışı bırakabilirsiniz: Alternatif

    go tool 6g -S -N file.go 
    

, gccgo kullanabilirsiniz:

Sınamalarını oluşturacak olan

. Farklı optimizasyonları görmek için -O0/1/2/3 ile oynayabilirsiniz.

+0

Teşekkürler! GCCGO kullanımı iyi bir fikirdir. – Gautam

+1

'go build -gcflags -S test.go> test.s' da çalışmalıdır (https://golang.org/doc/asm adresine göre) – rkusa

+4

' aracın yönlüsü git -S file.go> file.S' 'go1.5'den beri –

14

-S çıktısını kullanmama, Git bağlayıcısının nesne koduna neyin yazıldığını oldukça fazla değiştirebildiğinden. Neler olup bittiğine dair bir fikir veriyor.

Go assembler çıktısı çok standart değil.

Bunu yapmak istediğimde, her zaman size güzel bir standart assembler çıkışı verecek olan objdump kullanıyorum.

Örneğin x86/amd64 için

objdump -d executable > disassembly 

Ve ARM için

(aynı olmasını sicil adlarını almak için git kullanır)

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

çalıştırın çıkan yürütülebilir dosya üzerinde go tool objdump.

Çıktıyı ilginç işlevlerle kısıtlamak için, -s seçeneğini kullanın.