Как просмотреть содержимое переменной типа LPVOID - PullRequest
2 голосов
/ 29 сентября 2011

У меня есть функция C, которая принимает параметр типа LPVOID.Передаваемые значения - это отдельный массив символов \ 0.Как я могу привести параметр, чтобы увидеть входящее значение в visual studio / windbg?

Ответы [ 4 ]

4 голосов
/ 30 сентября 2011

Вы можете сделать это в сценарии. Будет работать что-то вроде следующего, которое предполагает строки 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"
3 голосов
/ 30 сентября 2011

Нет актеров, которые позволили бы вам наблюдать это в окнах наблюдения. Для VS вам придется открыть окно памяти по адресу в начале нулевого разделенного блока.

В команде WinDbg db <my_address> сбрасывает необработанную память вместе с преобразованием ASCII. Если размер блока превышает 128 байт, добавьте в команду параметр l. Например, это выведет первые 0x200 байтов для локальной переменной pVoid:
db poi pVoid l200

2 голосов
/ 29 сентября 2011

Просто приведение к 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);
       }   
  }
1 голос
/ 10 мая 2014

опять очень поздний ответ, но dpa в windbg можно использовать для печати списка

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

установить bp на somefunc или если у вас нет символов на адресе lik bp 401020 используйте аргумент dpa (бла здесь) или используйте 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:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...