dds means dump dwords intrepreting the result as symbols suppose 0x401234 contains 0x77123456 and 0x77123456 is resolved as kernel32!CreateFileA dds 0x401234 will yield kernel32!CreateFileA if you do dds esp it can return bogus symbols as stack can contain address that may be a constant which might resolve to a symbol edit dds/dqs/dps are meant to be used to look for addresses that resolve to symbol you can use it against stack register esp/rsp/va to look for symbols only keep in mind it can return bogus symbols for example after import table is resolved you can look what imports were resolved using dps /dds 0:000> dds calc+1000 l6;dps calc+1000 l6 00461000 760b0468 SHELL32!SHGetSpecialFolderPathW 00461004 76115708 SHELL32!SHGetFolderPathW 00461008 7615a129 SHELL32!ShellAboutW 0046100c 7619dd83 SHELL32!SHCreateDirectory 00461010 760b1e46 SHELL32!ShellExecuteExW 00461014 00000000 00461000 760b0468 SHELL32!SHGetSpecialFolderPathW 00461004 76115708 SHELL32!SHGetFolderPathW 00461008 7615a129 SHELL32!ShellAboutW 0046100c 7619dd83 SHELL32!SHCreateDirectory 00461010 760b1e46 SHELL32!ShellExecuteExW 00461014 00000000 if you had used dd here it would be just a bunch of DWORDS 0:000> dd calc+1000 00461000 760b0468 76115708 7615a129 7619dd83 00461010 760b1e46 00000000 other dereferncing commands inlude **dda / ddu / ddp / dpp** dda derefences an ascii string ddu derefernces an unicode string ddp dereferences a pointer (only 4 butes or a dword dpp dereferences a pointer ( either 4 or 8 bytes based on arch) suppose you have code like this if you compile with using vc++ **cl /Zi /Od /EHsc /analyze /W4 dds.cpp /link /RELEASE** and execute it #include <stdio.h> #include <stdlib.h> char *azz = "forever"; char *bzz = "learning"; char *czz = "for"; char *dzz = "ever"; char *ezz = "learn"; char *fzz = "ing"; char *gzz = "for"; char *hzz = "eve"; char *f[] = {azz,bzz,czz,dzz,ezz,fzz,gzz,hzz}; int main () { char **moo[] = { &f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&f[6],&f[7] }; char *meow[] = { f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7] }; for(int i =0;i <_countof(f);i++) { printf("%p %10s\n" ,moo[i],meow[i]); } return 0; } you will get a result like this 012158A0 forever 012158A4 learning 012158A8 for 012158AC ever 012158B0 learn 012158B4 ing 012158B8 for 012158BC eve if you set a breakpoint on line 18 and do dds you can see how windbg resolves the char** to module!symbol notation windbg -c "bp `dds!dds.cpp:18`;g" dds.exe 0:000> bl 0 e Disable Clear 013910d0 [c:\dds.cpp @ 18] 0001 (0001) 0:**** dds!main+0x70 0:000> .lastevent Last event: 808.1b8: Hit breakpoint 0 0:000> rM0 dds!main+0x70: 013910d0 ff743430 push dword ptr [esp+esi+30h] ss:0023:002cfa50=013cb1a0 0:000> dds esp l14 002cfa20 013d5678 dds!__argc 002cfa24 013d40f0 dds!_iob+0x90 002cfa28 00000fa0 002cfa2c 00000000 002cfa30 013d48a0 dds!f <--------- 002cfa34 013d48a4 dds!f+0x4 <------ 002cfa38 013d48a8 dds!f+0x8 <------ 002cfa3c 013d48ac dds!f+0xc <----- 002cfa40 013d48b0 dds!f+0x10 <------- 002cfa44 013d48b4 dds!f+0x14 <-------- 002cfa48 013d48b8 dds!f+0x18 <--------- 002cfa4c 013d48bc dds!f+0x1c <--------- 002cfa50 013cb1a0 dds!__xt_z+0x4 002cfa54 013cb1a8 dds!__xt_z+0xc 002cfa58 013cb1b4 dds!__xt_z+0x18 002cfa5c 013cb1b8 dds!__xt_z+0x1c 002cfa60 013cb1c0 dds!__xt_z+0x24 002cfa64 013cb1c8 dds!__xt_z+0x2c 002cfa68 013cb1cc dds!__xt_z+0x30 002cfa6c 013cb1d0 dds!__xt_z+0x34 if you do dda esp you can see the strings 0:000> dda esp l14 002cfa20 013d5678 "." 002cfa24 013d40f0 "..." 002cfa28 00000fa0 002cfa2c 00000000 002cfa30 013d48a0 002cfa34 013d48a4 002cfa38 013d48a8 002cfa3c 013d48ac 002cfa40 013d48b0 002cfa44 013d48b4 002cfa48 013d48b8 002cfa4c 013d48bc 002cfa50 013cb1a0 "forever" <--------------- 002cfa54 013cb1a8 "learning" <----------- 002cfa58 013cb1b4 "for" <-------------- 002cfa5c 013cb1b8 "ever" 002cfa60 013cb1c0 "learn" 002cfa64 013cb1c8 "ing" 002cfa68 013cb1cc "for" 002cfa6c 013cb1d0 "eve" if you happen to compile check dpp ddp etc on both 32 bit and 64 bit binary for the same stack