我想在windbg中插入一个断点,使用名为“TSmartPointer :: TSmartPointer”的符号。
bp TSmartPointer<class CDataMemberMgr>::TSmartPointer<class CDataMemberMgr>
WinDbg注意到我没有找到任何符号。
我使用命令x
来搜索符号,但也找不到符号:
x TSmartPointer<class CDataMemberMgr>::TSmartPointer<class CDataMemberMgr>
当我更换“&lt;”和“&gt;”到“*”,WinDbg可以找到符号:
x TSmartPointer*class CDataMemberMgr*::TSmartPointer*class CDataMemberMgr*
我错了吗?如何插入此断点?
答案 0 :(得分:1)
我在WinDbg的内部帮助中找不到这个,但在Microsoft documentation中,这让我对空格有点疑惑
要在复杂函数上设置断点,包括包含空格的函数,以及C ++公共类的成员,请将表达式括在括号中。例如,使用bp(?? MyPublic)或bp(operator new)。
此外,它明确谈到尖括号:
您必须以@!“三个符号开头,并以引号(”)结束。如果没有此语法,则不能在MASM评估程序中的符号名称中使用空格,尖括号(&lt;,&gt;)或其他特殊字符。
(强调我的)
因此,在您的情况下,以下内容应该有效:
bp @!"TSmartPointer<class CDataMemberMgr>::TSmartPointer<class CDataMemberMgr>"
引号也应该关注空格。
并对@ Kurt Hutchinson持久性发表评论:
对于模板类,使用Windbg想要的精确间距和尖括号位置非常重要。有时在那里会有一个额外的空间是重要的。您可以通过首先进行符号查找来判断它应该是什么,例如x MSHTML!TSmartPointer * CDataMemberMgr *。 Windbg应该进行通配符匹配并打印出一堆符号名称。然后,您应该使用@!“...”引用从该列表中复制并粘贴正确的名称。不要尝试自己重新键入符号名称,因为空格很重要,如果你错过了一个,Windbg将无法正确匹配。