Синтаксис для просмотра структур в окне памяти WinDbg? - PullRequest
1 голос
/ 14 июня 2019

Так что по какой-то причине я не использую IDE при программировании. Я компилирую свои программы и генерирую соответствующие им PDB в командной строке. Как следствие, я использую WinDbg для отладки, что я не против. В любом случае, пожалуйста, обратите внимание на следующие данные:

typedef struct _ex
{
    char *ptr0;
    char *ptr1;
    char *ptr2;
} ex;

ex  *example; // assume example and members point to somewhere memory

Как вы видите членов структуры example в окне памяти? Я пробовал example->ptr0 и example.ptr0, а также *, размещенные здесь и там, но всегда получаю ошибку Unable to retrieve information. У меня есть настройка рабочего пространства, и я хотел бы подготовить пару окон памяти с некоторыми значениями структуры, когда они входят в область видимости, и мне не нужно каждый раз копировать адреса вставки или, что еще хуже, печатать их. Есть ли правильный синтаксис для этого?

1 Ответ

3 голосов
/ 14 июня 2019

источник

:>dir /b
disptype.cpp

:>type disptype.cpp
// compile with cl /Zi /W4 /O1 /analyze /nologo disptype.cpp /link /nologo /release
// either disable inlining or compile as debug
// optimisation will blow away stuffstruct function and load rcx,rdx,r8 with argv[]
// and call printf directly
#include <stdio.h>
#include <stdlib.h>
typedef struct _ex
{
    char *ptr0;
    char *ptr1;
    char *ptr2;
} ex;
__declspec(noinline) void stuffstruct (ex *myex,char *a,char *b,char *c) {
                myex->ptr0 = a;
                myex->ptr1 = b;
                myex->ptr2 = c;
                return;
}
int main (int argc, char * argv[])
{
        if(argc != 4)
        {
                printf( "usage %s how are you\n" , argv[0]);
                exit(0);
        }
        ex myex;
        stuffstruct(&myex,argv[1],argv[2],argv[3]);
        printf ("%s repeats 3 argv's \n%s\n%s\n%s\n",argv[0],myex.ptr0,myex.ptr1,myex.ptr2);
        return 0;
}

скомпилируйте и скомпонуйте и используйте

:>cl /Zi /W4 /O1 /analyze /nologo disptype.cpp /link /nologo /release
disptype.cpp

:>disptype.exe
usage disptype.exe how are you

:>disptype.exe how are you
disptype.exe repeats 3 argv's
how
are
you

:>

windbg (для удобства копирования используйте cdb)

:>cdb disptype.exe how are you

Microsoft (R) Windows Debugger Version 10.0.17763.132 AMD64

$$ go to the relevent function

0:000> g disptype!stuffstruct 
disptype!stuffstruct:
00007ff6`3f541000 488911          mov     qword ptr [rcx],rdx ds:00000044`02cffe60=000000000000001f

$$ run until return so our struct is initialised
0:000> pt
disptype!stuffstruct+0xb:
00007ff6`3f54100b c3              ret

if you have src / private pdb you can look at locals using dv

0:000> dv
           myex = 0x00000044`02cffe60
              a = 0x0000019c`437f65b5 "how"
              b = 0x0000019c`437f65b9 "are"
              c = 0x0000019c`437f65bd "you"

пример оценщика выражений c ++, использования dt и dx

0:000> ?? myex
struct _ex * 0x00000044`02cffe60
   +0x000 ptr0             : 0x0000019c`437f65b5  "how"
   +0x008 ptr1             : 0x0000019c`437f65b9  "are"
   +0x010 ptr2             : 0x0000019c`437f65bd  "you"

you can also ask windbg to display type and coerce pointer 
either with dt or the new dx 

0:000> dt /v disptype!myex

Local var [AddrFlags c8  AddrOff 0000000000000000  Reg/Val rcx (3)] @ rcx Type _ex*

disptype!myex = 4402cffe60
struct _ex, 3 elements, 0x18 bytes
   +0x000 ptr0             : 0x0000019c`437f65b5  "how"
   +0x008 ptr1             : 0x0000019c`437f65b9  "are"
   +0x010 ptr2             : 0x0000019c`437f65bd  "you"


 0:000> dx (disptype!_ex *) @rcx
(disptype!_ex *) @rcx : 0x4402cffe60 [Type: _ex *]
    [+0x000] ptr0             : 0x19c437f65b5 : "how" [Type: char *]
    [+0x008] ptr1             : 0x19c437f65b9 : "are" [Type: char *]
    [+0x010] ptr2             : 0x19c437f65bd : "you" [Type: char *]
0:000>

принуждение к адресу, который будет интерпретироваться как наша структура

0:000> dx (disptype!_ex *) @rax
(disptype!_ex *) @rax : 0x19c437ff290 [Type: _ex *]
    [+0x000] ptr0             : 0x19c437f6880 : "ALLUSERSPROFILE=C:\ProgramData" [Type: char *]
    [+0x008] ptr1             : 0x19c437f5dc0 : "APPDATA=C:\Users\xxxx\AppData\Roaming" [Type: char *]
    [+0x010] ptr2             : 0x19c437f5e20 : "CommandPromptType=Native" [Type: char *]
0:000>

вы говорите об окне памяти в графическом интерфейсе (atl +5) это окно не может отображать типы, оно может отображать данные только как предопределенный тип, например бит, байт, слово, слово, плавающее число, двойное число, строка и т. д.

настроить либо местных жителей, либо часы (по моему скромному мнению, оба - громоздкое использование недвижимости, ухудшают производительность, бла-бла, но, по моему мнению, вы можете с радостью использовать их, если хотите)

Вот снимок экрана

enter image description here

...