正如我评论的那样,我使用 windbg 转储这些结构
用于遍历的示例代码
#include <iostream> //01
#include <list> //02
#include <vector> //03
#include <map> //04
#include <queue> //05
#include <string> //06
int main(void) //07
{ //08
std::string ms; //09
std::wstring mw; //10
std::map< char,int > mm; //11
std::vector<int> mv1,mv2,mv3,mv4; //12
std::queue<std::vector<int>> mq; //13
//14
ms = "This is a big Ascii string for that matter to avoid sso"; //15
mw = L"This is a big Wide string for that matter to avoid sso"; //16
mm = {{'a',0x61},{'b',0x62},{'c',0x63},{'d',0x64}}; //17
mv1.insert(mv1.end(), {mm['a'],mm['b'],mm['c'],mm['d']}); //18
mv2.insert(mv2.end(), {mm['b'],mm['c'],mm['a'],mm['d']}); //19
mv3.insert(mv3.end(), {mm['d'],mm['b'],mm['a'],mm['c']}); //20
mv4.insert(mv4.end(), {mm['c'],mm['b'],mm['a'],mm['d']}); //21
mq.push(mv1); //22
mq.push(mv2); //23
mq.push(mv3); //24
mq.push(mv4); //25
std::cout << ms << "\n"; //26
std::wcout << mw << "\n"; //27
std::cout << mm.begin()->first << "\n"; //28
std::cout << *mv1.begin() << "\n"; //29
std::cout << *mq.front().begin() << "\n"; //30
std::cout << *mq.back().begin() << "\n"; //31
} //32
在 vs2017 devcmd 提示符下编译并链接为 x86
:>cat complink.bat
pushd .
call "c:\Program Files\Microsoft Visual Studio\2017\Community\Common7\Tools\vsdevcmd.bat"
popd
cl /Zi /W4 /analyze /EHsc /nologo /Od nsstd.cpp /link /release
:>
将其加载到windbg 中执行直到第26 行以初始化所有变量。
运行下面给出的脚本来转储队列的->vector's->maps->integer 值并退出。
Windbg 脚本
.for(r$t0=0;@$t0<4;r$t0=@$t0+1)
{
.for(r $t1=0;@$t1<4;r$t1 =@$t1+1)
{
.printf "%c\t" , @@c++( mq.c._Mypair._Myval2._Map[@$t0]->_Mypair._Myval2._Myfirst[@$t1] )
}
.printf "\n"
}
结果
:>cdb -c "g `nsstd!nsstd.cpp:26`;$$>a< dumpq.wds;q" nsstd.exe | awk "/Reading/,/quit/"
0:000> cdb: Reading initial command 'g `nsstd!nsstd.cpp:26`;$$>a< dumpq.wds;q'
WARNING: Line information loading disabled
ModLoad: 6c700000 6c703000 C:\Windows\system32\api-ms-win-core-synch-l1-2-0.DLL
a b c d
b c a d
d b a c
c b a d
quit: