首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WINDBG:查看未命名命名空间中变量的值

WINDBG:查看未命名命名空间中变量的值
EN

Stack Overflow用户
提问于 2018-05-11 19:25:47
回答 1查看 543关注 0票数 0

当您进入Windbg时,是否存在某种方法来查看未命名命名空间中的变量的值?我将变量定位如下:

代码语言:javascript
复制
0:000> x mod!ns::*myvar*
70f7afc6          mod!ns::`anonymous namespace'::`dynamic initializer for 'myvar'' (void)
717bb799          mod!ns::`anonymous namespace'::`dynamic atexit destructor for 'myvar'' (void)
71a00718          mod!ns::`anonymous namespace'::myvar = <no type information>

myvar基本上是一个std::map,并且有一个调试器可视化工具(natvis)可供它使用,这样?? myvar就应该显示一些有用的东西。但是,由于这个匿名命名空间处于中间位置,我似乎无法找到正确的语法来显示myvar中的值。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-14 20:28:56

默认情况下,visual studio调试器下的监视窗口中不支持匿名命名空间,直到最近的7/17。

从历史上看,风车在实现这些花哨显示器方面落后了一两英里。

那就是说你的名字空间嵌套了吗?

我想是的,因为在模块mod! ns ::之后有一个ns

如果情况不是这样,x mymap将产生一个可点击的dml链接,它将正确显示类型,如果它是嵌套的,windbg会吐出,没有可用的类型信息

在这种情况下,可以使用指针(如mod!std::map..........xxx... )将它们转换为实际类型。

下面是在windbg下编译和执行的人为的源代码,它演示了一些可能性。

第一个文件的源,它包含、未命名的ns和命名的嵌套未命名ns,还引用了另一个包含匿名命名空间的文件。

代码语言:javascript
复制
#include "anonall.h"
namespace {
    map<char, const char*> mymap;
    const char *Greek_Alphabets[ALLOCSIZ] = { "Alp","Bet","Gam","Del","Eps" };
}
namespace ns {
    namespace {
        map<char, const char*> mymap;
        const char *Greek_Alphabets[ALLOCSIZ]={ 
        "Alpha","Beta","Gamma","Delta","Epsilon" };
    }
}
void anonnsptwo(void);
void anonnsptre(void) {
    cout << "\nfrom Anonymous NS Map in " << __FILE__ << " " << __LINE__ << "\n\n";
    for (int i = 0; i < ALLOCSIZ; i++) {
        mymap.insert(pair<char, const char*>(char('M' + i), Greek_Alphabets[i]));
    }
    map<char, const char*>::iterator iter = mymap.begin();
    for (iter; iter != mymap.end(); iter++)
        cout << iter->first << " = " << iter->second << "\n";
}
int main(void) {
    anonnsptre();
    cout << "\nfrom Anonymous NS Map in " << __FILE__ << " " << __LINE__ << "\n\n";
    for (int i = 0; i < ALLOCSIZ; i++) {
        ns::mymap.insert(pair<char, const char*>(char('A'+i),ns::Greek_Alphabets[i]));
    }
    map<char, const char*>::iterator iter = ns::mymap.begin();
    for (iter; iter != ns::mymap.end(); iter++)
        cout << iter->first << " = " << iter->second << "\n";
    anonnsptwo();
    return 0;
}

第一个文件引用的第二个文件的来源

代码语言:javascript
复制
#include "anonall.h"
namespace ns {
    namespace {
        map<char, const char*> mymap;
        const char *Greek_Alphabets[ALLOCSIZ]={"Zeta","Eta","Theta","Iota","Kappa"};
    }
}
void anonnsptwo(void) {
    cout << "\nfrom Anonymous Namespace Map in " << __FILE__ << "\n\n";
    for (int i = 0; i < ALLOCSIZ; i++) {
    ns::mymap.insert(pair<char, const char*>(char('Z'-i),ns::Greek_Alphabets[i]));
    }
    map<char, const char*>::iterator iter = ns::mymap.begin();
    for (iter; iter != ns::mymap.end(); iter++)
        cout << iter->first << " = " << iter->second << "\n";
}

常见的头文件内容

代码语言:javascript
复制
#pragma once
#include <iostream>
#include <map>
#define ALLOCSIZ 5
using namespace std;

编译并链接vs community 2017 (15.6.4) cmd提示符

代码语言:javascript
复制
:\>echo off

ls
anonall.h  anonone.cpp  anontwo.cpp

cl /Zi /W4 /analyze /EHsc /Od /nologo anonone.cpp anontwo.cpp /link /release /nologo

anonone.cpp
anontwo.cpp
Compiling...
Generating Code...

ls
anonall.h                       anonone.obj                     anontwo.obj
anonone.cpp                     anonone.pdb                     vc140.pdb
anonone.exe                     anontwo.cpp
anonone.nativecodeanalysis.xml  anontwo.nativecodeanalysis.xml

执行二进制文件

代码语言:javascript
复制
anonone.exe
from Anonymous NS Map in anonone.cpp 15

M = Alp
N = Bet
O = Gam
P = Del
Q = Eps

from Anonymous NS Map in anonone.cpp 25

A = Alpha
B = Beta
C = Gamma
D = Delta
E = Epsilon

from Anonymous Namespace Map in anontwo.cpp

V = Kappa
W = Iota
X = Theta
Y = Eta
Z = Zeta

使用cdb只显示结果而不需要用户干预。

如果使用windbg而不是cdb,则x*!*mymap的结果将是可点击的链接。

请注意大小=5,并注意其他两个没有类型信息的匿名mymap

(关于如何打印这些地图的问题如下所示)

设置第一个文件返回的断点(程序结束)

grep -in ret.* anonone.cpp

33 :返回0; <<行号为33

启用没有信息的行,在src行上设置条件延迟中断,并在命中该中断时,打印x命令的结果并退出

>cdb -c ".lines;bu anonone.cpp:33 \"x **mymap*\\;g;q‘anonone.exe e

代码语言:javascript
复制
cdb -c ".lines;bu `anonone.cpp:33` \"x *!*mymap*\";g;q" anonone.exe

Microsoft (R) Windows Debugger Version 10.0.16299.15 X86

0:000> cdb: Reading initial command '.lines;bu `anonone.cpp:33` "x *!*mymap*";g;q'

snipp======================

0118b938          anonone!mymap = { size=0x5 }
01175198          anonone!mymap$initializer$ = 0x01101040
011742c0          anonone!`anonymous namespace'::`dynamic atexit destructor for 'mymap'' (void)
01101040          anonone!`anonymous namespace'::`dynamic initializer for 'mymap'' (void)
011742e0          anonone!ns::`anonymous namespace'::`dynamic atexit destructor for 'mymap'' (void)
011742d0          anonone!ns::`anonymous namespace'::`dynamic atexit destructor for 'mymap'' (void)
01101080          anonone!ns::`anonymous namespace'::`dynamic initializer for 'mymap'' (void)
01101060          anonone!ns::`anonymous namespace'::`dynamic initializer for 'mymap'' (void)
0118b930          anonone!ns::`anonymous namespace'::mymap = <no type information>
0118b960          anonone!ns::`anonymous namespace'::mymap = <no type information>

quit:

现在可以将mymap @ 0x0118b960和0x0118b930的地址转换为std::map。

(请执行x anonone!std::map点击选项卡查找类型信息,使其成为指针并粘贴地址并使用dx表达式计算器获取显示)

这类似于dx ( anonone!std:map......xx..yy..zz *) 0x0118b960

代码语言:javascript
复制
ntdll!LdrpDoDebuggerBreak+0x2c:
771d05a6 cc              int     3
Processing initial command '$$>a< displayanon.txt'
0:000> $$>a< displayanon.txt
ModLoad: 6b450000 6b453000   C:\Windows\system32\api-ms-win-core-synch-l1-2-0.DLL
00d6b938          anonone!mymap = { size=0x5 }
00d55198          anonone!mymap$initializer$ = 0x00ce1040
00d542c0          anonone!`anonymous namespace'::`dynamic atexit destructor for 'mymap'' (void)
00ce1040          anonone!`anonymous namespace'::`dynamic initializer for 'mymap'' (void)
00d542e0          anonone!ns::`anonymous namespace'::`dynamic atexit destructor for 'mymap'' (void)
00d542d0          anonone!ns::`anonymous namespace'::`dynamic atexit destructor for 'mymap'' (void)
00ce1080          anonone!ns::`anonymous namespace'::`dynamic initializer for 'mymap'' (void)
00ce1060          anonone!ns::`anonymous namespace'::`dynamic initializer for 'mymap'' (void)
00d6b930          anonone!ns::`anonymous namespace'::mymap = <no type information>
00d6b960          anonone!ns::`anonymous namespace'::mymap = <no type information>


this is the type which you can get by using x {mod}!{std::map {wildcard}}

class std::map<char,char const *,std::less<char>,std::allocator<std::pair<char const ,char const *> > >
   +0x000 _Mypair          : 
mymap                 : { size=0x5 } 
snipped
    [0x0]            : 77 'M', "Alp" [Type: 
    [0x1]            : 78 'N', "Bet" [Type: 
    [0x2]            : 79 'O', "Gam" [Type: 
    [0x3]            : 80 'P', "Del" [Type: 
    [0x4]            : 81 'Q', "Eps" [Type: 

0:000> dx ( std::map<char,char const *,std::less<char>,std::allocator<std::pair<char const ,char const *> > > *) 0x00d6b930
( std::map<char,char const *,std::less<char>,std::allocator<std::pair<char const ,char const *> > > *) 0x00d6b930 
snipped
    [0x1]            : 65 'A', "Alpha" [Type:
    [0x2]            : 66 'B', "Beta" [Type:
    [0x3]            : 67 'C', "Gamma" [Type:
    [0x4]            : 68 'D', "Delta" [Type:
    [0x5]            : 69 'E', "Epsilon" [Type:

0:000> dx ( std::map<char,char const *,std::less<char>,std::allocator<std::pair<char const ,char const *> > > *) 0x00d6b960
( std::map<char,char const *,std::less<char>,std::allocator<std::pair<char const ,char const *> > > *) 0x00d6b960 
snipped
    [0x1]            : 86 'V', "Kappa" [Type: std::pair<char const ,char const *>]
    [0x2]            : 87 'W', "Iota" [Type: std::pair<char const ,char const *>]
    [0x3]            : 88 'X', "Theta" [Type: std::pair<char const ,char const *>]
    [0x4]            : 89 'Y', "Eta" [Type: std::pair<char const ,char const *>]
    [0x5]            : 90 'Z', "Zeta" [Type: std::pair<char const ,char const *>]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50299004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档