windbg

在WinDBG中设置断点的命令

痴心易碎 提交于 2020-02-24 09:55:23
命令 ========== ~0 bp 02sample!KBTest::Fibonacci_stdcall "r esp" 在零号线程上的KBTest类的Fibonacci_stdcall函数上设置断点, 并且在触发断点时执行"r esp"命令. bl 列出所有已经设置了的断点 bc * 清除所有断点 bp 02sample!KBTest::Fibonacci_stdcall “r esp;g” 在所有线程上设置断点, 并且在触发断点时执行"resp;g"两条命令. bm 02sample!*kbtest* 命令bm可以在参数中指定一个符号模式, 这样在所有与这个符号匹配的地址上都将设置一个断点. 上面的命令使用bm在KBTest的所有方法上设置断点. bu ole32!CoInitializeEx Windows操作系统会在必要时加载动态链接库, 而我们经常需要在一个还没有被加载的模块上设置断点. 命令bu可以用来设置一个延迟断点, 只有当这个断点所在的模块被加载时, 延迟断点才能成为一个真正的断点. 上面的命令将在DCOM的初始化函数中设置一个延迟断点. 内存访问断点 ============ 内存访问断点的名令为ba, 即Break on Access. 用户态的命令语法: [ ~ Thread ] ba [ ID ] Access Size [ Options ] [

在WinDBG中设置断点的命令

只谈情不闲聊 提交于 2020-02-24 09:54:20
命令 ========== ~0 bp 02sample!KBTest::Fibonacci_stdcall "r esp" 在零号线程上的KBTest类的Fibonacci_stdcall函数上设置断点, 并且在触发断点时执行"r esp"命令. bl 列出所有已经设置了的断点 bc * 清除所有断点 bp 02sample!KBTest::Fibonacci_stdcall “r esp;g” 在所有线程上设置断点, 并且在触发断点时执行"resp;g"两条命令. bm 02sample!*kbtest* 命令bm可以在参数中指定一个符号模式, 这样在所有与这个符号匹配的地址上都将设置一个断点. 上面的命令使用bm在KBTest的所有方法上设置断点. bu ole32!CoInitializeEx Windows操作系统会在必要时加载动态链接库, 而我们经常需要在一个还没有被加载的模块上设置断点. 命令bu可以用来设置一个延迟断点, 只有当这个断点所在的模块被加载时, 延迟断点才能成为一个真正的断点. 上面的命令将在DCOM的初始化函数中设置一个延迟断点. 内存访问断点 ============ 内存访问断点的名令为ba, 即Break on Access. 用户态的命令语法: [ ~ Thread ] ba [ ID ] Access Size [ Options ] [

windbg命令详解

青春壹個敷衍的年華 提交于 2020-02-24 09:52:20
DLL 该扩展仅在内核模式下使用,即使它是在 Ext.dll 中的。 Windows NT 4.0 Ext.dll Windows 2000 Ext.dll Windows XP和之后 Ext.dll 注释 如果不提供参数,调试器会列出所有进程,以及时间和优先级统计。这和使用 !process @#Process 0 作为 CommandString 值一样。 To terminate execution at any point, press CTRL+BREAK (in WinDbg) or CTRL+C (in KD). 附加信息 关于进程的一般信息,查看 线程和进程 。进程操作和获取进程信息,查看 控制进程和线程 。 !for_each_thread !for_each_thread 扩展对目标机中每个线程执行一次指定的调试器命令。 语法 !for_each_thread [ " CommandString " ] !for_each_thread -? 参数 CommandString 指定要为每个线程执行的调试器命令。如果 CommandString 包括多条命令,则需要用分号( ; )分隔他们,并且将 CommandString 包含在引号(")中。如果 CommandString 被包含在引号中,则 CommandString 中的命令不能包含引号。在

WinDbg使用介绍

怎甘沉沦 提交于 2020-02-24 09:51:04
Windbg工作空间     WinDbg使用工作空间来描述和存储调试项目的属性、参数及调试器设置等信息。工作空间与vc中的项目文件很相似。WinDbg定义了两种工作空间,一种为默认工作空间,另一种为命名的工作空间。当没有明确使用某个命名空间时,WinDbg总是使用默认工作空间。   WinDbg在安装后就有预先创建了一些列默认空间。分别为基础工作空间、默认内核工作空间、默认远程调试工作空间、特定处理器工作空间、默认用户态工作空间。它们分别定义了在WinDbg在各种条件下的一些配置、参数设置等。   基础工作空间:当调试会话尚未建立,WinDbg处于闲置状态时,会使用此空间作为默认空间。   默认内核工作空间:当WinDbg开始内核调试,但是尚未与调试目标建立连接时,会使用此空间作为默认空间。   默认远程调试工作空间:当通过调试服务器进行远程调试时,会使用此空间作为默认空间。   默认的用户态工作空间:当使用WinDbg调试一个已运行的进程时,会使用这个空间作为默认工作空间。   当WinDbg打开一个应用程序开始调试时,调试器会 根据可执行文件的路径和文件名为其创建一个默认工作空间,如果已经存在工作空间,就使用已存在的。在WinDbg的文件菜单中可以使用另存为..创建一个命名的工作空间。 WinDbg的工作空间中保存了一下信息:   调试会话状态:包括,断点、打开的源文件

Windbg实用手册

本秂侑毒 提交于 2020-02-24 08:58:01
Windbg工作中用的不多,所以命令老是记不住,每次使用都要重新查命令,挺烦。 趁这次培训的机会好好测试和总结了一下,下次再用就方便多了。 在这里一起共享一下,如果有错误,请指正。 基本知识和常用命令 (1) Windbg下载地址 http://msdn.microsoft.com/en-us/windows/hardware/gg463009.aspx 安装完后执行windbg –I将Windbg设置成默认调试器 (2) Windbg的命令分为标准命令,原命令和扩展命令,输入问号(?)可以显示所有的标准命令的帮助信息; 元命令以一个点(.)开始,输入.help可以显示所有的原命令的帮助信息;扩展命令以叹号(!)开始。 所有命令的具体用法可以通过F1查看Windbg的帮助文件。 (3) 通过设置符号文件路径,让Windbg自动从微软网站更新系统Dll的符号文件 SRV*d:\symbols* http://msdl.microsoft.com/download/symbols (4) 用分号(;)作为分隔符,可以在一行输入多条命令 (5) 按上下箭头可以浏览和选择以前输入过的命令 (6) Ctrl+Break终止一个很长时间没有完成的命令, Ctrl+Break也可以让正在运行的程序暂停 (7) Windbg默认的数值进制一般是16, 可以通过n命令查看和设置当前进制

Windbg源码调试

两盒软妹~` 提交于 2020-02-24 08:55:32
Windbg提供比VS2008丰富很多的调试命令,尤其是调试多线程程序。 今天试着怎么使用源代码方式调试。为了说明调试命令,《C++标准库》一书里的例子做示范。 // testcast.cpp #include <stdio.h> #include <iostream> struct A { virtual void test() { printf_s("in A\n"); } }; struct B : A { virtual void test() { printf_s("in B\n"); } void test2() { printf_s("test2 in B\n"); } }; struct C : B { virtual void test() { printf_s("in C\n"); } void test2() { printf_s("test2 in C\n"); } }; void Globaltest(A& a) { try { C &c = dynamic_cast<C&>(a); printf_s("in GlobalTest\n"); } catch(std::bad_cast) { printf_s("Can't cast to C\n"); } } int main() { A *pa = new C; A *pa2 = new B; pa-

Windbg学习笔记:源码模式调试

…衆ロ難τιáo~ 提交于 2020-02-24 08:54:52
源语言要求:C, C++, or assembly. #1 编译要求 符号文件( .pdb files) ---- visual studio 2012默认生成 源代码 打开编译器开关 /Od /Oi #2 定位符号文件和源代码文件 #3 单步源码调试的范例 .lines enable source line information bp main set initial breakpoint l+t stepping will be done by source line l+s source lines will be displayed at prompt g run program until "main" is entered pr execute one source line, and toggle register display off p execute one source line #4 设置特定行源码断点 ? ` [[ module ! ] filename ][ : linenumber ] ` 此命令显示模块源码文件某行的地址, 注意:里面的符号不是靠近回车键的逗号,而是ESC键下面的键。图中的第二行是逗号,第一行是正确写法。 下图是成功设置断点后的截图。 来源: https://www.cnblogs.com/servo/archive/2012

Windbg命令学习2(!sym和.reload)

泪湿孤枕 提交于 2020-02-24 08:51:21
以下示例以windbg加载calc.exe为例: 1 .!sym !sym 扩展控制显示详细的符号加载和符号提示。 .!sym : 不带参数表示显示当前的详细符号加载和符号提示的设置状态 给个示例: 0:001> !sym !sym <noisy/quiet - prompts/prompts off> - noisy mode - symbol prompts on 其实细心点可以看出sym的四种状态了, noisy / quiet - prompts /prompts off,所以我们要记这个命令的用法,就只要调用下!sym,就看到所有用法了.嘿嘿,我还比较聪明的 <>后面表示当前的设定状态, !sym noisy 激活详细符号加载(noisy symbol loading)显示。 给个示例: 0:001> !sym noisy noisy mode - symbol prompts on !sym quiet 禁止详细符号加载显示 0:001> !sym quiet quiet mode - symbol prompts on !sym prompts 当SymSrv 接收到认证请求时,允许弹出对话框。 0:001> !sym prompts quiet mode - symbol prompts on !sym prompts off

Windbg 离线调试.Net 程序入门

好久不见. 提交于 2020-02-24 08:50:22
在哪些情况下,必须祭出一些复杂的调试器呢?大概有以下: 程序异常崩溃 程序内存泄露 程序挂起 程序消耗cpu 高 内存泄露有.Net Memory Profiler神器情况下,能比windbg更容易找到问题(当然限于托管代码内存泄露,许多非托管的还是比较难搞). 参考 使用.Net Memory Profiler 分析.Net程序内存泄露 同样CPU监控工具也有ANT Profiler 之类工具. 但总有一些BUG难以重现,特别是在非开发机器出现,此时抓个dump,可能更为方便. 下面就以一个demo为例简单使用windbg 分析程序崩溃和挂起这两种情况. 异常的最佳实践 按照我的经验,很多代码反映出的是---不知道什么是异常,什么时候抛异常,什么地方捕获异常,或有日志,连个堆栈信息都看不到. 如何编写正确的代码才是,这应当才是问题的根源.再方便的调试的工具,耗费的时间也依然很多. 我很长时间用不上windbg是因为.NET程序调试太为简单了. 关于使用异常推荐一篇文章 http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET windbg 安装 下载安装后要配置symbol path 抓Dump 程序崩溃时弹出错误对话框之类.只要进程还没退出,也就是我们说”没飞”

Incredible number of logical threads; windbg can't see them?

佐手、 提交于 2020-02-22 07:51:32
问题 I've got a process that is showing ~4,294,965,900 "current logical threads" (according to the performance counters) and ~400 physical threads. I've created a memory dump using ADPlus (-hang), and windbg (!threads) only shows me the physical threads. How do I find out where all these logical threads are coming from? 回答1: How do I find out where all these logical threads are coming from? they aren't. They don't exist. You simply can't have 4 billion threads of any kind, unless you're running on