我有一个C函数,它接受LPVOID类型的参数。传入的值是\ 0分隔的字符数组。如何转换参数以查看visual studio / windbg中的传入值?
答案 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: