如何在VS Code中监视C++类静态方法内的静态变量
我尝试在C++中监视静态类函数内的静态变量(具体场景为模板类静态函数中的静态变量,原理一致)。示例代码如下:
struct DoNothing { }; template<class A, uint32_t N, class CriticalSection=DoNothing> class StaticPool : public A { private: struct PoolStorage { bool m_bInUse[N]; A m_Items[N]; }; static PoolStorage& GetStaticStorage() { static PoolStorage stc_storage = {N}; return stc_storage; }; public: StaticPool(){}; virtual ~StaticPool(){}; void *operator new(size_t size) { CriticalSection critical; void *ptr = nullptr; PoolStorage &pool = GetStaticStorage(); for(unsigned i=0;i<N;++i) { if( !pool.m_bInUse[i]) { pool.m_bInUse[i]=true; ptr = &pool.m_Items[i]; break; } } return ptr; }; void operator delete(void*ptr) { CriticalSection critical; PoolStorage &pool = GetStaticStorage(); for(unsigned i=0;i<N;++i) { if(&pool.m_Items[i]==ptr && pool.m_bInUse[i]) { pool.m_bInUse[i] = false; break; } } }; };
我希望查看StaticPool<MyObjectType,10>::GetStaticStorage()::stc_storage,在函数作用域内可通过监视窗口查看该变量,但退出作用域后就无法显示内容。请问VS Code的监视窗口中是否有指定“该类、该函数、该变量”的语法?我搜索到的方案多针对Visual Studio而非VS Code,尝试过两种语法均失败,提示“-var-create: unable to create variable objects”,尝试过的语法:
StaticPool<MyObject,10>::GetStaticStorage()::stc_storage(我认为是GDB格式){StaticPool<MyObject,10>::GetStaticStorage,,}stc_storage
可行的解决方法
VS Code默认使用GDB作为调试器,针对这类静态变量,以下几种方式可以成功监视:
修正GDB符号引用语法
确保编译时关闭优化(-O0)并添加调试信息(-g),然后在监视窗口输入:StaticPool<MyObject, 10>::GetStaticStorage()::stc_storage优化开启时编译器可能会对变量符号进行混淆,导致GDB无法识别,因此关闭优化是关键。
通过函数返回值间接查看
由于GetStaticStorage()返回的是静态变量的引用,直接监视函数调用即可查看完整的结构体内容:StaticPool<MyObject, 10>::GetStaticStorage()这种方式不受函数作用域限制,只要模板类已实例化就能正常访问。
通过内存地址强制转换
如果前两种方法无效,可先在GetStaticStorage()内打断点,获取stc_storage的地址(比如&stc_storage),然后在监视窗口输入:*(StaticPool<MyObject,10>::PoolStorage*)0x实际内存地址这种方式在开启优化的场景下依然有效,但内存地址会随程序运行变化,每次调试都需要重新获取。
内容的提问来源于stack exchange,提问作者Russ Schultz

