2016-04-06 30 views
3

bu stacktrace alıyorum StackTrace burada da görülebilirnasıl yorumlanır Git bir go programı çalıştırırken

func (c *Client) Event(e *Event) error 

: https://github.com/DataDog/datadog-go/blob/cc2f4770f4d61871e19bfee967bc767fe730b0d9/statsd/statsd.go#L285

Event için tip tanımı burada görülebilir: https://github.com/DataDog/datadog-go/blob/cc2f4770f4d61871e19bfee967bc767fe730b0d9/statsd/statsd.go#L333

Client için tip tanımı burada görülebilir: https://github.com/DataDog/datadog-go/blob/cc2f4770f4d61871e19bfee967bc767fe730b0d9/statsd/statsd.go#L59

Sorum, nasıl daha genel bu hat üzerinde bellek adreslerini yorumlayabilir ve do edilir hedefler olarak ve argümanlar olarak yazılan değişkenleri içeren herhangi yığın izleri? (Ben bu konuda bulabildim tek bilgi olan), Ben yapılar dahil edildiğinde çıkış nasıl yorumlanacağı hakkında bir şey görmedik http://www.goinggo.net/2015/01/stack-traces-in-go.html baktı

github.com/DataDog/datadog-go/statsd.(*Client).Event(0x0, 0xc8200c7ec8, 0x0, 0x0) 

.

+0

Eğer onların müşterisiyseniz, Datadog desteğini bu konuda desteklemeye değer olabilir. – twotwotwo

+1

@twotwotwo işaretçiyi takdir ediyor, ancak programımın çalışmadığı gerçeğinden rahatsız değilim. Gerçekten bilmek istediğim, yığın izlemenin nasıl yorumlanacağıdır. – des4maisons

cevap

7

@twotwotwo isimli bir yorum sayesinde, bunu düşündüm. Bu hat

github.com/DataDog/datadog-go/statsd.(*Client).Event(0x0, 0xc8200c7ec8, 0x0, 0x0) 
  • ilk 0x0 olarak

    nil gerçekten olan *Client olup.
  • 0xc8200c7ec8*Event
  • aşağıdaki 0x0, 0x0 tip error dönüş değeri temsil ederler. error, http://blog.golang.org/error-handling-and-go'a göre, bir arabirimdir. http://research.swtch.com/interfaces'a göre, arayüzler iki işaretçi olarak saklanır. İlk işaretçi, arayüzde saklanan tip bilgisini gösterir ve ikinci işaretçi, arayüzde saklanan verilere işaret eder.

I işlev imzaları yığın izleme görünür ne kadar farklı kendim göstermek için aşağıdaki programı yazdım:

*Y üzerine etki eder, fakat herhangi bir bağımsız değişken veya dönüş değeri bam adlandırılır
package main 

import "errors" 

type X struct { 
     i int 
} 

type Y struct { 
} 

func (y *Y) foo(x *X) { 
     panic("panic in foo") 
} 

func (y *Y) bar(x *X) (*Y) { 
     panic("panic in bar") 
     return y 
} 

func (y *Y) baz(x *X) (error) { 
     panic("panic in baz") 
     return errors.New("error in baz") 
} 

func (y *Y) bam() { 
     panic("panic in bam") 
} 

func main() { 
     y := new(Y) 
     x := new(X) 
     // comment out the ones you don't want to check 
     y.foo(x) 
     y.bar(x) 
     y.baz(x) 
     y.bam() 
} 

, çıkış içerir:

foo bağımsız değişken olarak bir *X *Y üzerinde etkili olan, adı verilen ve alır
main.(*Y).bam(0xc82002df48) 

, b, ut bir dönüş değeri, çıkış içerir:

bar *Y üzerinde etkili olan, adı
main.(*Y).foo(0xc820033f30, 0xc820033f30) 

, bağımsız değişken olarak bir *X alır ve bir *Y döner çıkış içerir:

main.(*Y).bar(0xc820033f30, 0xc820033f30, 0x40fb46) 

zaman baz, *Y üzerinde etkili olan, adı verilen değişken olarak *X alır ve döner bir error (bir arayüz olan), çıkış içerir:

main.(*Y).baz(0xc820033f38, 0xc820033f38, 0x0, 0x0) 
+0

Adım adım örnekler için teşekkürler! – gmcnaughton

2

Elinizde nil bir işaretçi dereferansı var. (Eğer muhtemelen temas etmemelidir paketi unsafe kullanıyorsanız, bu yüzden tahmin ediyorum sürece değiliz.) github.com/some/path/server/http.go:86 çağrıldığında

O func (c *Client) Event(e *Event) error için e argüman benziyor

nil olduğunu.

+0

Cevabınız için teşekkürler, ancak bu sorunu çözmekle ilgilenmediğim kadarıyla, github.com/DataDog/datadog-go/statsd.(*Client adresindeki çeşitli adreslerin nasıl yorumlanacağını öğrenmek istiyorum. Olay (0x0, 0xc8200c7ec8, 0x0, 0x0) anlamına gelir. Bunu açıklamak için sorumu düzenleyeceğim. – des4maisons

+2

@ des4maisons - alıcı ('' Client') argüman listesinde ilk sırada gelir. 0x0' bir nil işaretçisidir. '0xc8200c7ec8', Event işaretçisinin ham değeridir. Son iki hakkında emin değilim; _returned_ [interface value] (http://research.swtch.com/interfaces) 'de iki kelime olabilirler. Geçilen ham kelimelerin bir dökümünü aldığınızı unutmayın, ör. [bir dilim üç kelime olarak görünecektir] (http://research.swtch.com/godata). Bunları daha kolay sindirebilen [panicparse] (https://github.com/maruel/panicparse) denilen bir şey var ve hatta kaynağını kullanışlı bir şekilde gözden geçirebilirsiniz. – twotwotwo

+0

@twotwotwo Teşekkürler, tam olarak ne olduğunu. Açıklamanla ilgili bir cevap yazdım. – des4maisons