مشخصات کتاب
-
Mario Hewardt
-
2010
-
انگلیسی
-
5465
-
433
-
0
ADVANCED .NET DEBUGGING
CONTENTS
Foreword . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxi
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxxiii
PART I: OVERVIEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Chapter 1: Introduction to the Tools . . . . . . . . . . . . . . . . . . . . . . . . . 3
Debugging Tools for Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
.NET 2.0—Redistributable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
.NET 2.0—SDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
SOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
SOSEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
CLR Profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Performance Counters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Reflector for .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
PowerDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Managed Debugging Assistants . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Chapter 2: CLR Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
High-Level Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
CLR and the Windows Loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Loading Native Images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Loading .NET Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Application Domains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
The System Application Domain . . . . . . . . . . . . . . . . . . . . . . . . . . 37
The Shared Application Domain . . . . . . . . . . . . . . . . . . . . . . . . . 37
The Default Application Domain . . . . . . . . . . . . . . . . . . . . . . . . . 37
Assembly Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Assembly Manifest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
Type Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Sync Block Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Type Handle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Method Descriptors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Metadata Tokens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
EEClass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Chapter 3: Basic Debugging Tasks . . . . . . . . . . . . . . . . . . . . . . . . . 69
The Debugger and the Debugger Target . . . . . . . . . . . . . . . . . . . . . . 69
Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Controlling Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Breaking Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Resuming Execution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Stepping Through Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Exiting a Debugging Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Loading Managed Code Extensions . . . . . . . . . . . . . . . . . . . . . . . . . 85
Loading the SOS Extension DLL . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Loading the SOSEX Extension DLL . . . . . . . . . . . . . . . . . . . . . . . . 89
Controlling CLR Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Setting Breakpoints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Setting Breakpoints on JIT Compiled Functions . . . . . . . . . . . . . . . . 93
Setting Breakpoints on Functions Not Yet JIT Compiled . . . . . . . . . . 96
Setting Breakpoints in Precompiled Assemblies . . . . . . . . . . . . . . . 98
Setting Breakpoints on Generic Methods . . . . . . . . . . . . . . . . . . . 101
Object Inspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Dumping Raw Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Dumping Value Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Dumping Basic Reference Types . . . . . . . . . . . . . . . . . . . . . . . . . 116
Dumping Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Dumping Stack Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Finding Object Sizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Dumping Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Thread Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
ClrStack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
DumpStack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
EEStack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
COMState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Code Inspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Unassembling Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Getting a Method Descriptor from a Code Address . . . . . . . . . . . 144
Showing the Intermediate Language Instructions . . . . . . . . . . . . . . 145
CLR Internals Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Getting the CLR Version . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Finding the Method Descriptor from a Name . . . . . . . . . . . . . . . . 147
Dumping the Sync Block of an Object . . . . . . . . . . . . . . . . . . . . 148
Dumping the Method Table of an Object . . . . . . . . . . . . . . . . . . . 148
Dumping Information About the Managed
Heap and Garbage Collector . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Diagnostics Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Finding the Application Domain of an Object . . . . . . . . . . . . . . . 149
Process Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
SOSEX Extension Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Extended Breakpoint Support . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Managed Metadata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Stack Traces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Object Inspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Automated Deadlock Detection . . . . . . . . . . . . . . . . . . . . . . . . . 159
Managed Heap and Garbage Collector Commands . . . . . . . . . . 161
Crash Dump Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
PART II: APPLIED DEBUGGING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Chapter 4: Assembly Loader . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
CLR Loader Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Assembly Identity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Global Assembly Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Default Load Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Load-from Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Load without Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Simple Assembly Load Failure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Load Context Failure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Interoperability and DllNotFoundException . . . . . . . . . . . . . . . . . . . 195
Debugging Light Weight Code Generation . . . . . . . . . . . . . . . . . . . 197
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Chapter 5: Managed Heap and Garbage Collection . . . . . . . . . . . 203
Windows Memory Architecture Overview . . . . . . . . . . . . . . . . . . . 204
Allocating Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
Garbage Collector Internals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Generations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Roots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Finalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Reclaiming GC Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Large Object Heap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Pinning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Garbage Collection Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Debugging Managed Heap Corruptions . . . . . . . . . . . . . . . . . . . . . 254
Debugging Managed Heap Fragmentation . . . . . . . . . . . . . . . . . . . 262
Debugging Out of Memory Exceptions . . . . . . . . . . . . . . . . . . . . . 272
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Chapter 6: Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Synchronization Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Thread Synchronization Primitives . . . . . . . . . . . . . . . . . . . . . . . . . 294
Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Mutex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Semaphore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
ReaderWriterLock(Slim) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Thread Pool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Synchronization Internals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Object Header . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Sync Blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Thin Locks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Synchronization Scenarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Basic Deadlock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Orphaned Lock Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Thread Abortion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Finalizer Hangs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
Chapter 7: Interoperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Platform Invocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
COM Interoperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
Runtime Callable Wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Debugging P/Invoke Calls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Calling Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Debugging Interop Leaks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Debugging COM Interop Finalization . . . . . . . . . . . . . . . . . . . . . . . 378
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
PART III: ADVANCED TOPICS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Chapter 8: Postmortem Debugging . . . . . . . . . . . . . . . . . . . . . . . . 391
Dump File Fundamentals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 392
Generating Dump Files Using the Debuggers . . . . . . . . . . . . . . . . 394
Generating Dump Files Using ADPlus . . . . . . . . . . . . . . . . . . . . . 401
Debugging Dump Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403
The Data Access Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 404
Dump File Analysis: Unhandled .NET Exception . . . . . . . . . . . . . . 407
Windows Error Reporting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409
Windows Error Reporting Architecture . . . . . . . . . . . . . . . . . . . . 410
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438
Chapter 9: Power Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
PowerDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Installing PowerDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439
Analyze-PowerDbgThreads . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
Send-PowerDbgCommand . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
Extending PowerDbg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
SOS Integration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
.NET Framework Source-Level Debugging . . . . . . . . . . . . . . . . . . 451
Visual Studio 2010 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
CLR Profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Running the CLR Profiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
Summary View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 462
Histogram Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464
Graph Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
WinDbg and the CmdTree Command . . . . . . . . . . . . . . . . . . . . . . . 467
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469
Chapter 10: CLR 4.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471
Debugging Tools for Windows . . . . . . . . . . . . . . . . . . . . . . . . . . 471
.NET 4.0 Redistributable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
SOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472
Managed Heap and Garbage Collection . . . . . . . . . . . . . . . . . . . . 472
Extended Diagnostics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Background Garbage Collection . . . . . . . . . . . . . . . . . . . . . . . . 478
Synchronization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Thread Pool and Tasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 480
Monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
Barrier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481
CountdownEvent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
ManualResetEventSlim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
SemaphoreSlim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
SpinWait and SpinLock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
Interoperability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Postmortem Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487