- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在按照 windbg.info 上的说明尝试找到与我的程序中的内存分配/泄漏对应的源。我设置了一个带有泄漏代码的测试用例来尝试演示这一点。我可以到达那里的一部分,但看不到实际来源。
有问题的 C++ 代码是调试版本(优化关闭等)。多次调用。
class test
{
public:
int Allocate()
{
pai = new int[128];
pasz = new char[128];
}
private:
int * pai = nullptr;
char * pasz = nullptr;
};
我遵循 windbg.info 上的指示(缩写):
- To get source information you must additionally enable page heap in step 1 (gflags.exe /i MyApp.exe +ust +hpa) ...
- Do a !heap -flt s [Size]. [Size]=AllocSize determined previously. This command will list down all blocks with that particular size.
- Do a !heap -p -a [UserAddr] to get the stack trace from where you have allocated that much bytes. Use the [UserAddr] that you got in previous step
- Do a dt ntdll!_DPH_HEAP_BLOCK StackTrace [MyHeapBlockAddr], where [MyHeapBlockAddr] is the DPH_HEAP_BLOCK address retrieved in step 3.
- Do a dds [StackTrace]", where [StackTrace] is the value retrieved in previous step. Note that dds will dump the stack with source information included.
我确实正确加载了所有符号:
00007ff7`b1400000 00007ff7`b142b000 ConsoleApplication1 C (private pdb symbols) c:\...
00007ff8`37ae0000 00007ff8`37c9e000 ucrtbased (private pdb symbols) c:\...
00007ff8`39d20000 00007ff8`39e16000 MSVCP140D (private pdb symbols) c:\...
00007ff8`40e30000 00007ff8`40e9e000 verifier (private pdb symbols) c:\...
00007ff8`40ec0000 00007ff8`40ee2000 VCRUNTIME140D (private pdb symbols) c:\...
00007ff8`6a410000 00007ff8`6a62d000 KERNELBASE (private pdb symbols) c:\...
00007ff8`6b4c0000 00007ff8`6b56c000 KERNEL32 (private pdb symbols) c:\...
00007ff8`6d9e0000 00007ff8`6dbb1000 ntdll (private pdb symbols) c:\...
我确实看到了一个“良好”的堆栈,它显示了对 test::Allocate 的调用:
0:004> !heap -flt s 2034
_DPH_HEAP_ROOT @ 272d60e1000
Freed and decommitted blocks
DPH_HEAP_BLOCK : VirtAddr VirtSize
Busy allocations
DPH_HEAP_BLOCK : UserAddr UserSize - VirtAddr VirtSize
00000272d60ecf70 : 00000272d6467fc0 0000000000002034 - 00000272d6467000 0000000000004000
0:004> !heap -p -a 00000272d6467fc0
address 00000272d6467fc0 found in
_DPH_HEAP_ROOT @ 272d60e1000
in busy allocation ( DPH_HEAP_BLOCK: UserAddr UserSize - VirtAddr VirtSize)
272d60ecf70: 272d6467fc0 2034 - 272d6467000 4000
...
00007ff7b14142a8 ConsoleApplication1!test::Allocate+0x0000000000000048
00007ff7b141495a ConsoleApplication1!main+0x000000000000008a
...
我想我现在可以得到这个内存分配的来源:
0:004> dt ntdll!_DPH_HEAP_BLOCK StackTrace 00000272d60ecf70
+0x060 StackTrace : 0x00000272`d2f106d0 _RTL_TRACE_BLOCK
0:004> dds 0x00000272`d2f106d0
00000272`d2f106d0 00000000
00000272`d2f106d4 00000000
00000272`d2f106d8 00008804
...
即使我设置了“源文件路径”,也没有源。我还没有找到任何成功案例的例子。我在环境设置或命令中做错了什么吗?
windbg 版本:6.12.0002.633 AMD64。 x64 测试可执行文件。
最佳答案
dds
是dump DWORD 的命令,解释为stack。这可能适用于 32 位应用程序。
您的应用程序是 64 位应用程序。我可以从像 00007ff7'b1400000
这样包含反引号的地址中看到这一点。所以你应该使用 dqs
(转储四字并解释为堆栈)。
更好的是 dps
(转储指针大小并解释为堆栈),因为它将使用 32 位或 64 位,具体取决于您的应用程序的体系结构。
关于c++ - windbg dds - 无法获取分配内存的源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51178758/
我正在尝试分析一些小型故障转储。我使用的是 Windows 10 Pro Build 1607 和 WinDbg 10.0.14321.1024。我的符号文件路径设置为 SRV*C:\SymCache
我正在尝试追踪谁在进行特定大小的分配,我尝试使用用户模式堆栈跟踪数据库 (gflags +ust),但由于 FPO,我无法看到整个堆栈。因此,我想在 RtlAllocateHeap 达到我正在寻找的分
是否可以搜索整个可执行内存空间以找到调用特定方法的所有位置?例如,我想从调用 MyApplcation!MyFunction 的位置查找所有函数。使用“s”命令搜索特定的 optcode 不是一个选项
我在我的程序中遇到了一个 stackoverflow 异常,它可能来自第三方库 microsoft.sharepoint.client.runtime.dll。 使用 adplus 创建故障转储,我面
是否有任何扩展命令可以这样做?我只想包含所有参数的整个命令行。 最佳答案 命令行参数等信息存储在 PEB 中(进程环境块)。 您可以找到 a list of common commands here.
在 OllyDbg 中,它允许你运行直到返回,例如你遇到了 ret或 leave操作说明。 WinDbg 支持吗?我在菜单中没有找到这样的功能。 最佳答案 如果您想在返回之前停止,可以使用pt .如果
我正在尝试使用 d* 命令评估 WindDbg 中调用堆栈的内容。我知道我要转储的数据的地址是 [ebp+8] .但是,当使用此命令时,WinDbg 以 8 字节偏移量在 ebp 处转储数据。我想转储
有没有办法告诉 WinDbg 忽略由 DebugBreak function 引起的程序断点? 最佳答案 看看 Controlling Exceptions and Events MSDN 上的页面。
我尝试在 c# 应用程序的源代码中使用 WinDbg 设置断点,但没有成功。 当我使用 WinDbg 时,有没有办法在托管应用程序的源代码处设置断点? 复制步骤如下: 1.制作一个简单的c#应用程序
我正在尝试使用 WinDBG 检查可执行文件的程序集,但我很难找到它。我想在程序的第一条指令处设置断点,但是当我尝试手动执行此操作(使用模块的地址)时,WinDBG 告诉我它“无法在该位置插入断点”,
我正在逆向一个 win32 应用程序。 问题: 调试程序时。我发现计数器曾经跳转到地址 0x0043D4A0。 (这是一个函数入口点)。 0043D4A0 51 P
作为驱动程序开发人员,WinDbg 是我最好的 friend 之一。 现在从 Windows 8 开始,我安装了新的 WDK 并想使用它的新 WinDbg。它具有一些不错的功能,例如通过网络进行远程调
我需要调试在 Windows 上运行的正在运行的程序。它有时会因“内存访问冲突”而崩溃。 使用 windbg(无法使用 IDE)我附加到正在运行的进程(这是程序不得停止的要求) 命令行是 windbg
我正在调查 WinDBG 中的 Windows 转储文件。我可以通过命令 .frame 切换调用堆栈帧,但我发现寄存器始终包含最后一个上下文。我的意思是,是否可以恢复属于非顶级调用堆栈帧的特定调用堆栈
我正在调试一个模块,该模块只有 .exe 和 .pdb,没有私有(private)符号。 在调试 session 期间,我需要检查内部结构。显然这个结构不会出现在 PDB 中,因为它是私有(priva
Intel Power Gadget该工具无法在我的系统上运行,我正试图找出原因。它是运行 Window 8.1 x64 的 Core i7-720QM。 AIDA64 可以很好地读取 CPU 温度,
我在程序中遇到访问冲突。 Windbg 显示程序正在尝试读取 0x09015000 .它在地址旁边显示问号 ( ?? )。我的问题是,这些问号表示什么。它们是否意味着从未分配过内存位置,即它不受任何物
如何将命令窗口的内容直接保存到日志文件中而不在WinDbg的命令窗口显示这些内容? 最佳答案 假设您还不知道这一点,您可以使用 -log{o|a} windbg command line选项来指定您希
我使用的是 WinDBG 6.12.0002.633 X86。 我遇到了命令行调试器 CDB 的问题,它没有显示与 k 的 WinDBG 相同的结果。和 kL命令。 在 WinDBG 中,k命令正确显
我正在开发一个 32 位应用程序,它有时会导致某些 64 位 Windows 7 机器崩溃。我使用 Sysinternals 的 ProcDump 实用程序生成了崩溃的转储文件。 (我使用了命令“pr
我是一名优秀的程序员,十分优秀!