私はWindbgを初めて使用し、値と参照タイプ.NETについていくつかのことを理解しようとしています。これが私が使用しているコードです
class Program
{
struct MyStruct
{
int x;
int y;
}
class MyClass
{
int x;
int y;
}
static void Main(string[] args)
{
MyStruct s ;
MyClass c = new MyClass();
Thread.Sleep(5 * 60 * 1000);
}
}
ここでスリープ状態にする唯一の理由は、実行中のプロセスにWindbgをアタッチする時間を与えるためです。ブレークポイントを設定するのがより良い方法かもしれませんが、とにかくここに私の質問があります。
- Windbgがプロセスに接続されると、このスレッド#3に侵入しますが、ご覧のとおり、マネージドthead ID 3のスレッドはありません。このスレッドはデバッガーによって使用されているだけですか?!threadsコマンドで表示されない可能性のある他のスレッドはありますか?もしそうなら、私にすべてのスレッドを与えることができるコマンドはありますか?
0:003>!threads -special
ThreadCount:2
UnstartedThread:0
BackgroundThread:1
PresidentingThread:0
DeadThread:0
Hosted Runtime:no
PreEmptive Lock ID OSID ThreadOBJ State GC GC Alloc Context Domain Count APT Exception
0 1 bbc 0000000000190c50200a020有効000000000027f3ca8:000000027f3fd0 0000000000187e40 0 MTA
2 2 106c 0000000000198430 b220有効0000000000000000:0000000000000000 0000000000187e40 0 MTA(ファイナライザー)
OSID特殊スレッドタイプ
1e98DbgHelper2106c
ファイナライザー
0:003>!CLRStack
OSスレッドID:0xe6c(3)
管理対象スタックをウォークできません。現在のスレッドは
管理対象スレッドではない可能性があります。!threadsを実行して
、プロセス内の管理対象スレッドのリストを取得できます
0:003> kb
RetAddr:Args to Child:Call Site
00000000 77978778 : 0000000000000000 00000000 00000000 0000000000000000 00000000 776d466d:00000000 00000000 00000000 00000000:ntdll!DbgUiRemoteBreakin + 0x38
00000000 00000000 00000000 00000000 00000000 00000000:00000000 00000000 00000000 00000000:ntdll!RtlUserThreadStart + 0x1d 00000000 : ntdll!DbgBreakPoint
0000000000000000 0000000000000000 00000000778d8791 : 0000000000000000 0000000000000000 : KERNEL32!BaseThreadInitThunk+0xd
0000000000000000 0000000000000000 00000000
- スレッド0は、私のMainメソッドを実行しているスレッドのようです。スタックオブジェクトのダンプを取得すると、MyStructが表示されず、何らかの理由でMyClassが2回表示されます。なぜ何かアイデアはありますか?
0:000>!CLRStack
OSスレッドID:0xbbc(0)
Child-SP RetAddr Call Site
000000000031edb0 000007fef6b32012 ConsoleApplication2.Program.Main(System.String [])
0:000>!DumpStackObjects
OSスレッドID:0xbbc(0)
RSP / REGオブジェクト名
000000000031edd800000000027f3c90ConsoleApplication2.Program + MyClass
000000000031ede8 00000000027f3c90 ConsoleApplication2.Program + MyClass
000000000031ee00 00000000027f3c70 System.Object [](System.String [])
000000000031ef88 00000000027f3c70 System.Object [](System.String [])
000000003 [](System.String [])
000000000031f198 00000000027f3c70 System.Object [](System.String [])
TIA