草庐IT

DEBUGGING

全部标签

c++ - Windows 堆分配调用堆栈 - 奇怪的调用堆栈

我正在尝试分析托管进程内存转储,怀疑是否存在native内存泄漏。为了能够使用windbg(并从那里使用!heap扩展),我为服务器进程激活了用户模式调用堆栈我看到很多大小为68的block。在这些block中(我可以使用!heap-p-a手动验证的block)有许多调用堆栈的形式!heap-p-a000000003ca5cfd0address000000003ca5cfd0foundin_HEAP@1ea0000HEAP_ENTRYSizePrevFlagsUserPtrUserSize-state000000003ca5cfa000090000[00]000000003ca5cfd

windows - WinDbg:设置断点时无法解决 xyz!abc::func 处的错误

我已将WinDbg附加到进程。当我使用命令bp设置断点时。我收到以下错误:bpxyz!abc::funcCouldn'tresolveerroratxyz!abc::func怎么了? 最佳答案 当你执行lmmxyz时,你得到了startendmodulename4d6c00004dc59000xyz(exportsymbols)C:\ProgramFiles\pathtoxyz术语exportsymbols告诉我们它只加载了DLL的“公共(public)”函数。要加载私有(private)符号,请执行.sympathc:\path\

windows - 如何注册为 NT 内核事件的实时 ETW 使用者?

我已经能够成功地使用logman来转储一些内核跟踪。但是,我希望能够以编程方式在我的应用程序中启用内核事件的实时消耗(主要是线程/进程创建/删除和文件I/O)。完成此任务的最佳方法是什么? 最佳答案 您在StartTrace中启用内核事件.在EVENT_TRACE_PROPERTIES您传递给StartTrace,EnableFlags包含不同内核事件提供程序的各种标志。将EVENT_TRACE_PROPERTIES中的LogFileMode设置为EVENT_TRACE_REAL_TIME_MODE成为实时消费者。然后您可以使用Pr

windows - 如何在 win32 上调试文件系统 "access denied"错误?

我现在在构建脚本上玩得很开心:我正在使用Waf来插入我们的构建过程,一切都很好,除了在Windows上,我在构建过程中遇到间歇性错误。错误基本上总是一种或另一种形式的“访问被拒绝”错误,与我在构建过程中创建的临时文件有关,以使某些工具能够运行并完成它的工作。例如,在运行NSIS之前要生成可执行安装程序,我必须将所有必需的文件“暂存”到构建目录并从那里运行命令。有时事情会按预期工作,但有时我会收到有关我复制的其中一个文件的错误报告,例如:文件:打开文件“Platform\\Win32\\lxml-2.2.1-py2.6-win32.egg”失败我花了很长时间试图找出问题所在,但这真的很难

C++ 内存调试器?

谁能推荐一个高质量的C++内存调试API或适用于Windows的软件(特别是与MinGW一起使用的软件)?我几乎可以肯定我的程序中存在内存泄漏,但我不知道从哪里开始寻找。另外,在相关说明中,我之前尝试自己重载全局new和delete运算符,并从那里存储调试信息。然而,当我尝试用重载的运算符替换每次出现的new时,它会抛出一堆错误。我只尝试使用一个简单的预处理器宏来这样做。#definenewnew(__FILE__,__LINE__)是否有解决该问题的独特方法?编辑:我可能应该更清楚这一点。事实上,我确实声明了一个重载,并且没有任何错误地实现了它。唯一的问题是当我尝试使用宏来替换对ne

windows - 拆卸卸载的模块

得到一个以卸载模块结束的堆栈跟踪。为了确保堆栈有意义,我想反汇编卸载的模块(另一方面检查调用是否可以从给定的地址开始(访问冲突:尝试从无效地址读取))。我可以加载模块(windbg):.reloadUnloaded.Dll=base,size但是在重新加载之后我无法反汇编代码。有没有办法做到这一点?在此先感谢您的帮助!G更多 最佳答案 来自MarcSherman的提示(参见上面的评论):使用windbg,您可以加载一个dll作为故障转储。加载后键入“lm”命令并在相对于给定基数的所需地址上进行反汇编。

c++ - 以 headless 模式运行 WinDbg

有没有办法在纯headless模式下使用WinDbg?我的用例是我应该能够在不启动WinDbgGUI的情况下为命令行上的小型转储模仿“!analyze-v”命令。 最佳答案 对于Windows调试工具,还有cdb,控制台调试器。要调试故障转储,请使用-z""选项。要立即运行命令,请使用-c"".要将所有内容输出到文件中,您可以使用常用的DOS重定向输出>或使用.logopen打开日志文件.要在分析后退出CDB,请使用q.您想确保符号设置正确,因此请包含.symfix;.reload.我更喜欢使用.symfix在命令中而不是-y,所以

c# - 在 WinDbg 中调试 C# 应用程序

我正在尝试在没有VisualStudio的系统上调试用C#编写的应用程序。应用程序没有崩溃......但我需要确定某些变量的值,以及是否访问代码的某些部分,基于我无法在VisualStudio所在的同一位置访问的驱动程序。我在虚拟机中运行此测试环境,无法访问互联网。我一直无法安装符号文件...但到目前为止这无关紧要。我一直在使用附加到此应用程序的WinDbg对驱动程序(c/c++)进行故障排除。我希望也能够从C#向WinDbg发送调试消息。System.Diagnostics.Debug.Write("helloworld\n");没有出现...我不知道是否相关,但我在添加Debug.

c++ - SymGetSymFromAddr64 有效,但 SymGetLineFromAddr64 失败,错误代码为 487

我正在学习Windows7中“DbgHelp”提供的StackWalkAPI。我编写了一个使用StackWalk64的异常过滤器。目的是回溯最多50行函数名和行号。“StackWalk64”遍历每个堆栈帧。从堆栈帧中检索到的地址(AddrPC)在“SymGetSymFromAddr64”和“SymGetLineFromAddr64”中分别用于检索符号名称和行号。但是,尽管“SymGetSymFromAddr64”成功运行,“SymGetLineFromAddr64”却失败了。返回的LastError是487。地址如何对前者成功而对后者不成功?我错过了什么吗?有什么帮助吗?LONGWIN

c++ - 获取实际不存在的进程加载模块

在检查MicrosoftWord的加载模块时,我遇到了一些非常奇怪的事情。我写了一个小程序来输出所有加载的DLL的位置。这是输出:当我试图在我的PC上找到这些模块时,我无法在给定位置找到它们,而是在另一个位置:我无法弄清楚为什么DLL的路径不同,而且我在Google中也找不到任何相关内容,尽管我怀疑它与VFS相关。也就是说,ProcessExplorer设法以某种方式显示了DLL的原始位置。谁能告诉我ProcessExplorer如何做到这一点,以及如何在我的代码中实现相同的结果?----------------编辑----------------我也尝试过注入(inject)DLL并