Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 何时以及如何使用windbg内核调试_Windows_Debugging_Windbg - Fatal编程技术网

Windows 何时以及如何使用windbg内核调试

Windows 何时以及如何使用windbg内核调试,windows,debugging,windbg,Windows,Debugging,Windbg,我发现Windbg在开发和调试期间非常有用。 但我主要是在使用模式调试中使用windbg windbg中的内核调试可以做什么? 或者什么时候应该使用windbg的内核调试 windbg中的内核调试有什么秘诀吗 提前感谢。当您需要调试与硬件直接交互的低级设备驱动程序时,通常使用内核调试。 在内核模式下调试要复杂得多,对于实时内核调试会话,您必须在不同于被调试系统的系统上运行调试器。对于大多数开发人员来说,用户模式足以完成大部分工作。 是一本关于wndbg调试的好书(包括关于内核调试的讨论) 该网站

我发现Windbg在开发和调试期间非常有用。 但我主要是在使用模式调试中使用windbg

  • windbg中的内核调试可以做什么? 或者什么时候应该使用windbg的内核调试

  • windbg中的内核调试有什么秘诀吗


  • 提前感谢。

    当您需要调试与硬件直接交互的低级设备驱动程序时,通常使用内核调试。
    在内核模式下调试要复杂得多,对于实时内核调试会话,您必须在不同于被调试系统的系统上运行调试器。对于大多数开发人员来说,用户模式足以完成大部分工作。
    是一本关于wndbg调试的好书(包括关于内核调试的讨论)


    该网站有许多教程,包括内核调试场景

    可能,当代码以内核模式运行时,您只想在内核模式下进行调试,即编写驱动程序或其他在内核中运行的程序时。或者,如果您正试图通过在内核中探索、戳戳和戳戳一些东西,在非常低的层次上了解更多关于Windows本身的信息


    在查找教程和其他参考资料时,您可能会查找“kd”参考资料,因为它们可能非常相似。(kd是一个命令行内核调试工具。)

    用户模式和内核模式WINDBG之间的主要区别在于,您可以看到内核模式WINDBG中的每个进程以及所有线程。您不必看到每个堆栈帧,因为它们经常被内存管理器调出

    我经常使用的一些常用命令

    !!进程0 列出每个正在运行的进程:

    **** NT ACTIVE PROCESS DUMP ****
    PROCESS 80a02a60  Cid: 0002    Peb: 00000000  ParentCid: 0000
        DirBase: 00006e05  ObjectTable: 80a03788  TableSize: 150.
        Image: System
    PROCESS 80986f40  Cid: 0012    Peb: 7ffde000  ParentCid: 0002
        DirBase: 000bd605  ObjectTable: 8098fce8  TableSize:  38.
        Image: smss.exe
    PROCESS 80958020  Cid: 001a    Peb: 7ffde000  ParentCid: 0012
        DirBase: 0008b205  ObjectTable: 809782a8  TableSize: 150.
        Image: csrss.exe
    PROCESS 80955040  Cid: 0020    Peb: 7ffde000  ParentCid: 0012
        DirBase: 00112005  ObjectTable: 80955ce8  TableSize:  54.
        Image: winlogon.exe
    PROCESS 8094fce0  Cid: 0026    Peb: 7ffde000  ParentCid: 0020
        DirBase: 00055005  ObjectTable: 80950cc8  TableSize: 222.
        Image: services.exe
    PROCESS 8094c020  Cid: 0029    Peb: 7ffde000  ParentCid: 0020
        DirBase: 000c4605  ObjectTable: 80990fe8  TableSize: 110.
        Image: lsass.exe
    PROCESS 809258e0  Cid: 0044    Peb: 7ffde000  ParentCid: 0026
        DirBase: 001e5405  ObjectTable: 80925c68  TableSize:  70.
        Image: SPOOLSS.EXE
    
    .进程{x} 选择要激活的进程,通常后面跟着!threads命令列出当前线程的进程列表

    !!堆栈0x2{foo.sys} 在所有线程中搜索包含指定驱动程序的调用堆栈

    !!普尔塞德 在调试内核内存不足的情况时非常有用,您所拥有的只是一个内核崩溃转储

    .撞车 当您通过串行电缆进行实时调试并且希望使目标计算机写入崩溃转储时,此功能非常有用

    !!虚拟机1 内存管理器统计信息的有用显示,例如:

    *** Virtual Memory Usage ***
          Physical Memory:     16270   (   65080 Kb)
          Page File: \??\E:\pagefile.sys
             Current:     98304Kb Free Space:     61044Kb
             Minimum:     98304Kb Maximum:       196608Kb
          Available Pages:      5543   (   22172 Kb)
          ResAvail Pages:       6759   (   27036 Kb)
          Locked IO Pages:       112   (     448 Kb)
          Free System PTEs:    45089   (  180356 Kb)
          Free NP PTEs:         5145   (   20580 Kb)
          Free Special NP:       336   (    1344 Kb)
          Modified Pages:        714   (    2856 Kb)
          NonPagedPool Usage:    877   (    3508 Kb)
          NonPagedPool Max:     6252   (   25008 Kb)
          PagedPool 0 Usage:     729   (    2916 Kb)
          PagedPool 1 Usage:     432   (    1728 Kb)
          PagedPool 2 Usage:     436   (    1744 Kb)
          PagedPool Usage:      1597   (    6388 Kb)
          PagedPool Maximum:   13312   (   53248 Kb)
          Shared Commit:        1097   (    4388 Kb)
          Special Pool:          229   (     916 Kb)
          Shared Process:       1956   (    7824 Kb)
          PagedPool Commit:     1597   (    6388 Kb)
          Driver Commit:         828   (    3312 Kb)
          Committed pages:     21949   (   87796 Kb)
          Commit limit:        36256   (  145024 Kb)
    
    别忘了全能者!锁

    对死锁机器进行故障排除绝对必要

    kd> !locks
    **** DUMP OF ALL RESOURCE OBJECTS ****
    KD: Scanning for held locks......
    
    Resource @ 0x80e97620    Shared 4 owning threads
         Threads: ff688da0-01<*> ff687da0-01<*> ff686da0-01<*> ff685da0-01<*> 
    KD: Scanning for held locks.......................................................
    
    Resource @ 0x80e23f38    Shared 1 owning threads
         Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
    KD: Scanning for held locks.
    
    Resource @ 0x80d8b0b0    Shared 1 owning threads
         Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
    2263 total locks, 3 locks currently held
    
    kd>!锁
    ****所有资源对象的转储****
    KD:扫描持有的锁。。。。。。
    资源@0x80e97620共享4个拥有线程
    螺纹:ff688da0-01 ff687da0-01 ff686da0-01 ff685da0-01
    KD:扫描持有的锁。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
    资源@0x80e23f38共享1拥有线程
    螺纹:80ed0023-01***实际螺纹80ed0020
    KD:扫描持有的锁。
    资源@0x80D8B0共享1个拥有线程
    螺纹:80ed0023-01***实际螺纹80ed0020
    总共2263个锁,目前持有3个锁
    

    使用此命令,您可以跟踪那些等待另一个线程释放的线程

    如果相关应用程序在VM中运行,并且主机有权访问symbol和源服务器,该怎么办?这里有内核/用户模式调试(或者更确切地说,使用远程内核调试器调试用户模式应用程序)用例的组合,不是吗?