如何避免 DbgCommand 命令被写入日志文件

2023-12-04

我有一个恼人的问题Pykd.pyd:我在脚本中使用它,启动了几个DbgCommand函数,例如:

DbgCommand("dt 0x000000eab8748430 CMap<int,int,CUIntArray *,CUIntArray *> m_nCount")

这是为了获取尺寸CMap目的。由于这是在脚本中完成的,使用了很多对象,所以我在以下位置使用日志文件Windbg (menu edit, Open/Close Log File),这里有一个问题:
当在看这个时Windbg窗口中,我只能看到结果DbgCommand调用,但在日志文件中我也看到命令本身:

Windbg window:

000000eab87488f0    CMap<int,int,CUIntArray *,CUIntArray *>  Size:[0]  // formatted DbgCommand result
000000eab8748930    CMap<int,int,CUIntArray *,CUIntArray *>  Size:[0]  // formatted DbgCommand result

Logfile:

dt 0x000000eab87488f0 CMap<int,int,CUIntArray *,CUIntArray *> m_nCount // DbgCommand command
000000eab87488f0    CMap<int,int,CUIntArray *,CUIntArray *>  Size:[0]  // formatted DbgCommand result
dt 0x000000eab8748930 CMap<int,int,CUIntArray *,CUIntArray *> m_nCount // DbgCommand command
000000eab8748930    CMap<int,int,CUIntArray *,CUIntArray *>  Size:[0]  // formatted DbgCommand result

我怎样才能避免DbgCommand命令被写入日志文件?

同时我发现一个参数suppressoutput存在,它可用于不在屏幕上显示命令的结果,但这不是我的意思,正如您在以下摘录中看到的:

测试脚本摘录:

dprintln("1 : x /2 <application_name>!CStringList::CStringList, true")
dbgCommand("x /2 <application_name>!CStringList::CStringList", True)
dprintln("2 : x /2 <application_name>!CStringList::CStringList, false")
dbgCommand("x /2 <application_name>!CStringList::CStringList", False)
dprintln("3")

屏幕上的结果:

1 : x /2 <application_name>!CStringList::CStringList, true
2 : x /2 <application_name>!CStringList::CStringList, false
004b6d3e          <application_name>!CStringList::CStringList
3

日志文件中的结果:

1 : x /2 <Application>!CStringList::CStringList, true
x /2 <Application>!CStringList::CStringList
004b6d3e          <Application>!CStringList::CStringList
2 : x /2 <Application>!CStringList::CStringList, false
x /2 <Application>!CStringList::CStringList
004b6d3e          <Application>!CStringList::CStringList
3

看起来suppressoutput是为了不显示DbgCommand结果在屏幕上,而我有兴趣不显示DbgCommand输入到日志中。

让我解释一下有什么问题typedvar解决方案:

由于某种奇怪的原因,CMap and CArray对象不能以简单的方式使用(标准windbg命令),如您所见:

0000000000335e90    <application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const * __ptr64,int,int>

如你看到的,dt不适用于此:

dt 0x0000000000335e90 <application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const * __ptr64,int,int>
Symbol <application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const * __ptr64,int,int> not found

这可以通过删除来解决<application_name> and __ptr64(不要忘记空格):

0:000> dt 0x0000000000335e90 CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,int,int>
<application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const *,int,int>
   +0x000 __VFN_table : 0x00000001`3fc77ac8 
   +0x008 m_pHashTable     : (null) 
   +0x010 m_nHashTableSize : 0x11
   +0x018 m_nCount         : 0n0
   +0x020 m_pFreeList      : (null) 
   +0x028 m_pBlocks        : (null) 
   +0x030 m_nBlockSize     : 0n10

这似乎与以下内容相对应x /2 *!* result:

00000001`3fc77ac8 <application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const * __ptr64,int,int>::`vftable'

但是如果我尝试使用typedVar它似乎不起作用:

if type_name.find("CMap<") != -1:
    dprintln("original type name : [%s]" % type_name)
    dprintln(("pointer : [0x" + pointer_format + "]") % ptr)
    var =  typedVar(type_name, ptr) # before translation of __ptr64
    nieuwe_grootte1 = var.m_nCount
    type_name = type_name.replace(application_name + "!","") # Normally type_name starts with "<application_name>!CMap<...", it must become "CMap<..."
    type_name = type_name.replace(" __ptr64","")             # apparently, when the CMap definition contains __ptr64, it doesn't work
                                                             # dt 0x000000eab8748430 CMap<int,int,CUIntArray *,CUIntArray *> m_nCount seems to work

    dprintln("after replacements type name : [%s]" % type_name)
    var =  typedVar(type_name, ptr) # after translation of __ptr64
    nieuwe_grootte2 = var.m_nCount

    grootte_result = dbgCommand(("dt 0x" + pointer_format + " %s m_nCount") % (ptr,type_name)).split(' : ')
    grootte = grootte_result[-1].split('\n')[0] # list[-1] is Python for "take the last entry of a list"
    grootte = grootte.replace("0n","")
    dprintln((pointer_format + "\t%s\t Size:[%s, %d, %d]") % (ptr, type_name, grootte, nieuwe_grootte1, nieuwe_grootte2))

这给出了以下结果:

original type name : [<application_name>!CMap<unsigned int,unsigned int,enum CService::PARAMETER_TYPE,enum CService::PARAMETER_TYPE>]
pointer : [0x00000000003355e0]
after replacements type name : [CMap<unsigned int,unsigned int,enum CService::PARAMETER_TYPE,enum CService::PARAMETER_TYPE>]
00000000003355e0    CMap<unsigned int,unsigned int,enum CService::PARAMETER_TYPE,enum CService::PARAMETER_TYPE>  Size:[105, 105, 105]
original type name : [<application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const * __ptr64,int,int>]
pointer : [0x0000000000335640]

Traceback (most recent call last):

  File "C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\heap_stat_extra.py", line 215, in <module>
    var =  typedVar(type_name, ptr) # before translation of __ptr64

TypeException: <application_name>!CMap<ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > >,wchar_t const * __ptr64,int,int> : invalid type name

我已经尝试过删除<application_name> and/or __ptr64但似乎并不能解决问题。此外,结果dt和“x/2!“(格式不正确)清楚地表明所提到的类型存在。看来typedVar有实际问题处理__ptr64标签。有解决方法吗?

Edit
我刚刚尝试过使用 pykd_team 中的 Python 命令,但它似乎仍然不起作用(这次是CArray对象),如您所见:

启动我的脚本给出以下结果:

  File "C:\Temp_Folder\blabla\heap_stat_logs_backup.py", line 232, in <module>
    collection_Size = typedVar(type_name, ptr).m_nCount

TypeException: CArray<CSyncRules::VersionRestriction *,CSyncRules::VersionRestriction * const &> : invalid type name

尝试调查正确的类名是什么:

0:000> !py
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> app = pykd.module("<Application>")
>>> for tp in app.enumTypes("*CArray*"):
...   print tp
... 
CArray<CSyncRules::VersionRestriction *,CSyncRules::VersionRestriction * const &>
...

正如你所看到的,类名是完全匹配的,但是还有一个TypeException。你知道现在该怎么办吗? (顺便说一句,我正在使用 Visual Studio Professional 2017)

New edit

该问题很可能是由 PYKD 引起的,无法处理星号(*) 在类型定义中。我可以使用任何转义字符来避免上述问题吗?


使用 pykd.typeVar 类。它是专门为此类情况设计的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免 DbgCommand 命令被写入日志文件 的相关文章

随机推荐

  • Solidity 中的动态数组

    我想声明一个简单的数组 动态列表 一个set函数推入一个字符串和一个get函数返回动态数组中保存的所有字符串 我搜索了很多但找不到这个简单的东西 这是我的解决方案 你需要experimental ABIEncoderV2返回字符串数组 pr
  • 如何在 DASH 内容的

    我已使用以下方式在网页中嵌入了 DASH 视频
  • ID/类别选择器

    我对 jQuery 选择器有一些问题 假设我想选择 elementID 但是elementID是一个变量 除了以其他方式执行此操作之外 还有其他可能性var variable elementID variable 我的意思是没有指定 还有其
  • 扩展并仅指定已知属性?

    我试图提供一个接受给定类型的映射的接口 并将其用于运行时逻辑和编译时类型 就像是 type SomeType a string b a string b string magicalFunction a 1 1 return type is
  • 在 __init__ 中使用继承的类方法

    我有一个由几个孩子继承的父类 我想使用父母的初始化其中一个孩子 classmethod初始化器 我怎样才能做到这一点 我试过 class Point object def init self x y self x x self y y cl
  • 如何像Xcode一样绘制带有蓝色色调的分段控件?

    我正在尝试重新创建 Xcode 中使用的分段控件 其中图像用蓝色绘制 例如在界面生成器中 到目前为止我有一个习惯NSSegmentedCell压倒性的 void drawSegment NSInteger segment inFrame N
  • 如何使用 Javascript 从 Google Api 检索服务帐户 OAuth2 令牌?

    我需要使用 google 项目服务帐户来使用 JavaScript 访问 google API 为了做到这一点 我需要 OAuth2 到 google API 服务器来获取身份验证令牌 据我所知 Google 提供了一个用于节点服务器的库
  • 检查字符串中是否有以字符 @ 开头的单词

    您好 感谢您花时间调查此问题 我正在开发一个评论系统 而不是使用嵌套评论 我只想添加 user 方法进行回复 举例来说 我输入了以下评论 moonwalker Thanks again for your reply 我正在寻找一个函数来检查
  • Git WebHook 不会拉取 (PHP)

    我有一个 PHP 文件 hook php 看起来像这样
  • 如何在Python中保存二维数组(列表)?

    我需要将表示游戏世界中的地图的二维数组保存到配置解析器中 数据如下 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 举个例子 我显然可以保存数据 但在读回数据后无法将其从字符串转换回列表 顺便说一句 我不介意是否必须使用 txt
  • 带有 templateUrl 和 ng-repeat 的自定义指令

    我已经研究这个问题几个小时了 终于我在 plunker 上复制了它 这是我的问题 当使用外部资源作为模板的自定义指令与 ng repeat 结合使用时 模型更改时视图无法正确渲染 在我的示例中 单击链接将替换模型 但旧数据尚未清除 如果我使
  • 将字符串列表与可用的字典/同义词库进行比较

    我有一个程序 C 它生成一个字符串列表 原始字符串的排列 大多数字符串是按预期随机分组的原始字母 即 etam aemt team 我想以编程方式找到列表中真正的英语单词的一个字符串 我需要一个同义词库 字典来查找和比较每个字符串 任何人都
  • 将 CSS/HTML 中的按钮与文本水平对齐一行?

    我想知道如何水平对齐按钮 最重要的是 我想向这些按钮添加文本 这就是我目前所拥有的 HTML 正文部分 div class tile div table class tile table tr td img class tile image
  • CSS 内部 id 选择器

    我在 CSS 文件中有以下 id 选择器 headerphoto 和 logo box 是 header id 的内部 id 选择器 我真的需要将这两个添加为内部 id 选择器吗 我可以将它们添加为普通的 id 选择器 这样做的最佳方法是什
  • 读取 Android 应用程序的 PKCS12/P12 客户端证书文件

    我正在尝试在我的 Android 应用程序中使用客户端证书 以便我可以确保仅与使用该应用程序或拥有该证书的人进行 HTTPS 通信 我的 res raw 文件夹中有证书 当我开始输入 R raw 时 Android Studio 就会看到它
  • 将缺失值替换为 n-1

    例如 我有 df pd DataFrame 0 420 np nan 455 np nan np nan np nan df 0 0 420 0 1 NaN 2 455 0 3 NaN 4 NaN 5 NaN 然后使用 df 0 isnul
  • 如何在多行中显示长文本的表视图节标题?

    我正在使用具有多个部分的表视图控制器 其中一些部分具有长文本 当我使用 titleForHeaderSection 时 如果文本长度超过表格视图框架 文本就会被截断 我想在下一行显示文本 而不是使用titleForHeaderInSecti
  • “星云”类不存在

    我在处理 3 3 时遇到问题 我刚刚开始开发一种星云模拟器 旨在模拟恒星从星云到红巨星的诞生和生命周期 到目前为止 我已经创建了两个类 Gas 针对每个单独的气体粒子 和 Nebula 指粒子的集合 我在编辑器中输入了以下代码 每次都得到相
  • 如何使用 Javascript 和 JQuery 操作 URL?

    我想制作一个包含大量 Javascript 交互的页面 但是 当用户浏览页面时 URL 也必须更改 因此 当用户共享 URL 或保存 URL 时 它可以引导他到达他的实际状态 我怎样才能做到这一点 例子 myapp com page1 my
  • 如何避免 DbgCommand 命令被写入日志文件

    我有一个恼人的问题Pykd pyd 我在脚本中使用它 启动了几个DbgCommand函数 例如 DbgCommand dt 0x000000eab8748430 CMap