WinDbg:我如何以编程方式解析`dt`的输出?

时间:2016-04-11 17:35:49

标签: arrays windbg

WinDbg dt -a <memory-address> <type>命令对于显示类型信息非常有用,我通常使用dt输出元素数组的类型信息。

如何以编程方式操作??(array-element)>>1输出的值?具体来说,对于数组中的每个元素,我想输出数组中每个元素的位移值(.for (r $t0=0; @$t0<0n100; r $t0=@$t0+1) { ??(dt 0xDEADBEEF)+(@@c++(sizeof(MY_TYPE))*@$t0) MY_TYPE)>>1 } ,用于数组中的每个值)。我试过这个包含100个元素的数组(示例数组内存地址为0xDEADBEEF,数据类型为MY_TYPE):

dt

基本上,对于数组中的每个元素,我想打印if ($savetodo=="true") { $content=array("descr"=>$descr); updateToDoInfo($id,$content); } 的输出,数值偏移1。

3 个答案:

答案 0 :(得分:3)

尝试使用pykd。它为您提供了pyb API,用于调试windbg的angine。您可以通过两种方式处理类型变量:

  1. 简单方法:解析。

    dtoutput = pykd.dbgCommand(&#34; dt _MYTYPE地址&#34;)

    callDtParser(dtoutput)#parse文本,你可以:re ....

  2. 正确的方法:pykd.typedVar

    myvar = pykd.typedVar(&#34; _MYTYPE&#34;,地址)

    print myvar.arrayField [10]&gt;&gt; 2#与C比较

  3. 如何安装pykd(使用bootstarpper) https://pykd.codeplex.com/releases/view/614442

    提示:不要使用python 2.7.11 - 它有一个bug并且在嵌入应用程序时不起作用(你可以通过更改默认的python registartion来修复它)

答案 1 :(得分:2)

您可以使用qwo,因为它从内存中读取:

.for (r $t0=0; @$t0<0n100; r $t0=@$t0+1) { r @$t1 = qwo(DEADBEEF+(@$t0*@@c++(sizeof(MY_TYPE))));?@$t1>>1 }

由于qwo是一个内存读取函数,因此可以通过编程方式操作该值。

答案 2 :(得分:0)

NatVis现在是解决此类问题的方法:

https://www.osr.com/blog/2015/11/06/fun-windbg-natvis-support/

基本上,您使用XML来描述您希望结构显示的方式,然后使用dx而不是dt显示它。