如何查看LPVOID类型的变量的内容

时间:2011-09-29 05:41:57

标签: c visual-c++ windbg

我有一个C函数,它接受LPVOID类型的参数。传入的值是\ 0分隔的字符数组。如何转换参数以查看visual studio / windbg中的传入值?

4 个答案:

答案 0 :(得分:4)

您可以在脚本中执行此操作。像下面这样的东西可以工作,它假设char *字符串,并且列表以双NULL结束(如MULTI_SZ):

$$ Print a MULTI_SZ value in the debugger. Note that 
$$ this script assume a char* string

$$ Grab the argument to the script
r @$t0 = ${$arg1}

$$ while *str != NULL
.while (by(@$t0) != 0) 
{

    $$ Print the string
    da @$t0

    $$ There's no strlen in this language, so find the NULL
    .while (by(@$t0) != 0) 
    {
        r @$t0 = @$t0 + 1
    }

    $$ String points to the NULL. Add one.
    r @$t0 = @$t0 + 1
}

保存到文本文件,然后在WinDBG中运行以下命令:

0:000> $$>a<c:\dumps\multisz.txt 0x012210ec
012210ec  "Foo"
012210f0  "Bar"
012210f4  "FooBar"

答案 1 :(得分:3)

没有任何演员可以让你在观看窗口中观察到。对于VS,您必须在空分隔块的开头的地址上打开一个内存窗口。

在WinDbg命令db <my_address>中转储原始内存以及ASCII转换。如果block大于128个字节,则向命令添加选项l。例如,这将打印出局部变量pVoid的第一个0x200字节:
db poi pVoid l200

答案 2 :(得分:2)

只需转换为char*即可。

  void f(LPVOID s)
  {
      char* ss = (char*) s; // put breakpoint here or watch the variable
      for(char* r = ss; *r != '\0'; r += (strlen(r)+1)) { // iterate the string
          printf("%s \n", r);
       }   
  }

答案 3 :(得分:1)

这是一个非常晚的答案,但windbg中的dpa可以用来打印列表

lpvoid:\>dir /b
lpvoid.cpp

lpvoid:\>type lpvoid.cpp
#include <stdio.h>
#include <windows.h>

    int somefunc(LPVOID blah)
    {
        printf("%s\n",*(PCHAR *)blah);
        return 0;
    }
    int main (void)
    {
        PCHAR foo[] = { "yay" , "boy" , "dog" , "cat" , "monkey" , "weedinducedweird
    o" };
        somefunc( foo);
        return 0;
    }

    lpvoid:\>cl /Zi /nologo lpvoid.cpp
    lpvoid.cpp

    lpvoid:\>dir /b *.exe
    lpvoid.exe

    lpvoid:\>lpvoid.exe
    yay

在somefunc上设置一个bp,或者如果地址上没有符号,请设置bp 401020 在参数上使用dpa(在此处为blah)或使用dpa @ esp + 8

    lpvoid:\>cdb -c "bp somefunc \"dpa poi(blah) l?6;q\";g;q" lpvoid.exe | grep -A 6
     yay
    0013ff60  00417c60 "yay"
    0013ff64  00417c64 "boy"
    0013ff68  00417c68 "dog"
    0013ff6c  00417c6c "cat"
    0013ff70  00417c70 "monkey"
    0013ff74  00417c78 "weedinducedweirdo"
    quit:

假设此处没有符号

lpvoid:\>cdb -c "bp 401020 \"dpa (@esp+8) l?6;q\";g;q" lpvoid.exe | grep -A 6 ya
y
0013ff60  00417c60 "yay"
0013ff64  00417c64 "boy"
0013ff68  00417c68 "dog"
0013ff6c  00417c6c "cat"
0013ff70  00417c70 "monkey"
0013ff74  00417c78 "weedinducedweirdo"
quit: