使用Visual Studio的调试器查看动态分配的以null结尾的字符串

3

有没有办法改变Visual Studio调试器的默认行为,使得当悬停在以null结尾的动态分配的字符数组(C ++)上时,它会显示字符串的全部内容,而不仅仅是第一个字符?

我应该提到我正在使用Visual Studio 2010。如果只能在VS2012中实现这一点,我也很想知道!


变量的类型是什么? - Richard
类型是const char* - Dan M. Katz
1个回答

4
这里有一个对于Visual Studio非常有用的链接:C++ Debugger Tips,其中提到了以下内容:
要将指针表达式解释为字符串,您可以使用“,s”表示简单的以null结尾的字符串,“,s8”表示UTF-8字符串,或者“,su”表示Unicode字符串。(请注意,表达式必须是指针类型才能正常工作)。
例如,您在以下函数中断点:
void function(char* s)
{
   // break here
}

在MSVC的监视窗口(或调试器)中,您可能会尝试仅添加“s”,但它只会显示第一个字符。但是,有了上述信息,您可以在监视窗口的变量后面添加以下后缀:
s,s8

如果您知道它是 Unicode 编码,请尝试:

s,su

这甚至适用于任意指针,或者说其他数据类型,例如调试一个QString的内容:

QString str("Test");
// break here

针对此问题,可能的观察窗口(或调试器)语句如下:

((str).d)->array,su                 <-- debug QString (Qt4) as unicode char string
(char*)str.d + str.d->offset,su     <-- debug QString (Qt5) as unicode char string
0x0c5eae82,su                       <-- debug any memory location as unicode char string

如果添加,s8,su没有效果,请尝试另一种变体。

这很方便,但我如何在不编辑单个字符的情况下编辑字符串中的字符?现在是2020年。 - vehsakul
@vehsakul 你为什么告诉我现在是2020年?我当然知道。如果你感到烦恼,请转向VS或Qt开发团队(并请友善)。在这里,我提出了一个解决方法 - 顺便说一下,这已经是几年前的事情了。 - DomTomCat
好的,我留下了我的评论并附带了后续问题,以防您或其他人知道答案。这应该是中立的。我提到2020年,因为我认为,如果现在在VS中没有这样的功能,那么这很糟糕。 - vehsakul
@DomTomCat:使用这种技术创建条件断点是否可行?例如,如果QString变量的内容等于“Test”,则在一行中中断。 - Baumann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接