如何在调试期间取消引用指针

Posted

技术标签:

【中文标题】如何在调试期间取消引用指针【英文标题】:How to dereference pointer during debug 【发布时间】:2016-10-31 00:14:02 【问题描述】:

我一次又一次地遇到这种类型的问题,所以现在问。我是一名电子工程师,因此习惯于编写低级代码。我在 C++ 中使用指针。

我有一个接受 char* msg 的函数。当我在函数中使用断点停止执行时,我只能看到 char* 参数的第一个字节。我如何得到其余的? char* 可能不会以 null 结尾,并且不会具有固定大小。假设我能知道它有多长,我不知道如何告诉 locals 窗口。

Visual Studio 有这些称为即时和调试窗口的东西。我以前没有用过它们吗?它们可以用来从这个消息中打印任意字符吗?在休息模式期间?怎么样?

【问题讨论】:

假设the char* may not be null terminated and will not be of fixed size,我建议检查指针中的地址并使用Memory选项卡,在那里你可以去那个地址,看看从头到尾的内容是什么你什么(或没有找到)。如果没记错的话,你可以在函数之前这样做,并在调试时查看该地址的内容是如何修改的(更改的字节应该突出显示)。 我明白了,我不知道这个内存查看器。但是,这不只以十六进制显示。真的不能在这里使用其中一个立即或调试窗口吗?我很困惑这些 Windows 的用途。 @quantum231,能否分享一下这个问题的最新信息? 我的程序严重依赖指针,因为我来自电子工程背景。在查看了我拥有的所有选项后,仍然被难以捉摸的错误和/或复杂性增加所困,我使用 OOP 方法重写了我的程序。几个月前,我读到了关于如何用 C++ 编写程序 OOP 技术的书。现在该程序正在运行。如果我真的需要,我只使用动态内存分配。否则,我只是访问了类中的私有变量以获取所有内容。一个类作为引用传递给函数中的另一个类。这也解决了许多其他问题。 不管怎样,这个内存内容查看器工具给我留下了深刻的印象。谢谢。 【参考方案1】:

无法直接在调试窗口调试,之前也有其他成员问过这种问题,分享了为什么只显示char*参数的第一个字节的原因:

http://www.cplusplus.com/forum/general/23205/

vs2010 c++ view pointers content by debug

在内存查看器中,您可以选择查看数据的方式,但如果您想打印地址,一种解决方法是您可以将其转换为其他类型的指针,例如转换为指向 void 或其他类型的指针。

【讨论】:

【参考方案2】:

尝试在 msg 中添加手表,然后尝试观看 msg,10。

您应该观看接下来的 10 个角色。

类似下面的截图:

【讨论】:

需要进行少量编辑。要显示的图像和消息而不是消息。

以上是关于如何在调试期间取消引用指针的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Cppcheck 解释 Null 指针取消引用?

如何在声纳中解决这个“可能的空指针取消引用”关键问题?

C++ 指针取消引用赋值

将取消引用的指针作为函数参数传递给结构

取消引用数组指针

函数指针的解引用是如何发生的?