Systemeigene Symbole für managed Code

30/08/2009 - 02:13 von Armin Zingler | Report spam
Schönen guten Tag,

ich habe auch eine lange Version auf Lager, aber ich versuch's erst mal
in Kürze: :-)

Ich hànge den Debugger (VS 2008) an einen Prozess an. Der Prozess führt
(auch) verwalteten Code aus. Den verwalteten Code kann man verwaltet
oder systemeigen Debuggen. Das làsst sich beim Anfügen an den Prozess ja
auswàhlen.

Die folgende Frage bezieht sich auf denselben, verwalteten Code: Warum
sieht der Callstack bei verwaltetem Debugging anders aus als bei
sytemeigenen Debuggen? (Beispiel s. ganz unten) Es ist ja faktisch
derselbe Callstack.

Mein Problem damit: Als echter Hardcorer/coder möchte ich natürlich
immer den tatsàchlichen Callstack sehen. Den bekomme ich aber nur bei
systemeigenem Debugging. Warum? Dann habe ich aber keine Symbole und
somit keinen Quellcode. Verwende ich hingegen verwaltetes Debugging habe
ich zwar Symbole+Quellcode aber nicht den tatsàchlichen Callstack.

Der Knackpunkt ist: Es wird in beiden Fàllen identischer Code bei
identischem Callstack ausgeführt. Die Ausgangssituation ist für den
Debugger somit völlig identisch.(!) Folglich sehe ich absolut keinen
Grund, warum er mir beim systemeigenen Debuggen keine Symbole anzeigt
bzw beim verwalteten einen anderen Callstack. Nochmal, die Situation ist
dieselbe, und somit müssten alle Informationen in beiden Fàllen
vorhanden sein.

Gibt's da draußen in der weiten Welt jemanden mit Einblick und ner
einleuchtenden Erklàrung? :-)

Dankeschön


Armin



Beispiel Callstack beim Unterbrechen in "Messagebox.Show"

1. systemeigenen:

ntdll.dll!_KiFastSystemCallRet@0()
user32.dll!_NtUserWaitMessage@0()
user32.dll!_InternalDialogBox@24()
user32.dll!_SoftModalMessageBox@4()
user32.dll!_MessageBoxWorker@4()
user32.dll!_MessageBoxTimeoutW@24()
user32.dll!_MessageBoxExW@20()
user32.dll!_MessageBoxW@16()
00e0253f()
System.Windows.Forms.ni.dll!7b7bfc85()
[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder
fehlen, keine Symbole geladen für System.Windows.Forms.ni.dll]
System.Windows.Forms.ni.dll!7b7bf933()
Microsoft.VisualBasic.ni.dll!5e5637e1()
mscorlib.ni.dll!792d6d66()
mscorlib.ni.dll!792e01ef()
mscorlib.ni.dll!792d6ce4()
mscorwks.dll!_CallDescrWorker@20()
mscorwks.dll!_CallDescrWorkerWithHandler@24()
mscorwks.dll!MethodDesc::CallDescr()
mscorwks.dll!MethodDesc::CallTargetWorker()
mscorwks.dll!MethodDescCallSite::CallWithValueTypes()
mscorwks.dll!ThreadNative::KickOffThread_Worker()
mscorwks.dll!Thread::DoADCallBack()
mscorwks.dll!Thread::ShouldChangeAbortToUnload()
mscorwks.dll!Thread::ShouldChangeAbortToUnload()
mscorwks.dll!Thread::ShouldChangeAbortToUnload()
mscorwks.dll!ManagedThreadBase::KickOff()
mscorwks.dll!ThreadNative::KickOffThread()
mscorwks.dll!Thread::intermediateThreadProc()
kernel32.dll!_BaseThreadStart@8()


2. verwaltet: (derselbe Haltepunkt!)

ntdll.dll!_KiFastSystemCallRet@0()
user32.dll!_NtUserWaitMessage@0()
user32.dll!_InternalDialogBox@24()
user32.dll!_SoftModalMessageBox@4()
user32.dll!_MessageBoxWorker@4()
user32.dll!_MessageBoxTimeoutW@24()
user32.dll!_MessageBoxExW@20()
user32.dll!_MessageBoxW@16()
[Übergang von Verwaltet zu Systemeigen]
System.Windows.Forms.dll!System.Windows.Forms.MessageBox.Show()
MeineExe!MeineKlasse.MeineMethode() Basic
MeineExe!MeineKlasse.MeineMethode() Basic
MeineExe!MeineKlasse.MeineMethode() Basic
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context()
mscorlib.dll!System.Threading.ExecutionContext.Run()
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()
kernel32.dll!_BaseThreadStart@8()
 

Lesen sie die antworten

#1 Jochen Kalmbach [MVP]
30/08/2009 - 11:14 | Warnen spam
Hallo Armin!

Beispiel Callstack beim Unterbrechen in "Messagebox.Show"

1. systemeigenen:

ntdll.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
00e0253f()
System.Windows.Forms.ni.dll!7b7bfc85()
[Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder
fehlen, keine Symbole geladen für System.Windows.Forms.ni.dll]
System.Windows.Forms.ni.dll!7b7bf933()
Microsoft.VisualBasic.ni.dll!5e5637e1()
mscorlib.ni.dll!792d6d66()
mscorlib.ni.dll!792e01ef()
mscorlib.ni.dll!792d6ce4()
mscorwks.dll!()
mscorwks.dll!()
mscorwks.dll!MethodDesc::CallDescr()
mscorwks.dll!MethodDesc::CallTargetWorker()
mscorwks.dll!MethodDescCallSite::CallWithValueTypes()
mscorwks.dll!ThreadNative::KickOffThread_Worker()
mscorwks.dll!Thread::DoADCallBack()
mscorwks.dll!Thread::ShouldChangeAbortToUnload()
mscorwks.dll!Thread::ShouldChangeAbortToUnload()
mscorwks.dll!Thread::ShouldChangeAbortToUnload()
mscorwks.dll!ManagedThreadBase::KickOff()
mscorwks.dll!ThreadNative::KickOffThread()
mscorwks.dll!Thread::intermediateThreadProc()
kernel32.dll!()


2. verwaltet: (derselbe Haltepunkt!)

ntdll.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
user32.dll!()
[Übergang von Verwaltet zu Systemeigen]
System.Windows.Forms.dll!System.Windows.Forms.MessageBox.Show()
MeineExe!MeineKlasse.MeineMethode() Basic
MeineExe!MeineKlasse.MeineMethode() Basic
MeineExe!MeineKlasse.MeineMethode() Basic
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context()
mscorlib.dll!System.Threading.ExecutionContext.Run()
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()
kernel32.dll!()



Ich sehe da jetzt keinen großen Unterschied ;)

Das "systemeigene" (besser native) debugger kennt eben keine Managed
Methoden und kann somit nur die "native" Namen anzeigen; diese
entsprechen aber nicht den "Managed" Methoden".
Auch zeigt der Native Debugger alle Methoden an, die wirklich
angespungen wurden; der managed Callstack fasst hingegen die internen
native Calls zusammen und zeigt nur die eigentlich wichtige
Managed-Methode an.

Wenn Du "richtige" (mixed) Callstacks haben willst, kommst Du nicht drum
herum die teilweise von Hand zusammen zu bauen.
Am besten verwende WinDbg mit "!EEStack" oder "!CLRStack" und "kb"

Siehe auch:

Mixed Code and Missing Information in the Call Stack Window
http://msdn.microsoft.com/en-us/lib...zd35w.aspx

You can't get a mixed-mode callstack from inprocess
http://blogs.msdn.com/jmstall/archi...tacks.aspx

Automated .NET Hang Analysis
http://blogs.msdn.com/tess/archive/...lysis.aspx

Greetings
Jochen

My blog about Win32 and .NET
http://blog.kalmbachnet.de/

Ähnliche fragen