c++ - 在调试期间显示 cpu 缓存和寄存器内容

标签 c++ memory-management visualization cpu-registers cpu-cache

我有一个使用复杂数据结构的软件,我想了解该程序如何利用不同的缓存和寄存器。

问题:

  • 是否有一些类似调试器的软件可以在断点处不仅显示程序流程,还显示寄存器、高速缓存和主内存的内容?
  • 也许以图形形式:这样,当我选择一个变量时,它会显示不同缓存/寄存器中的表示突出显示?

我目前正在使用 Visual Studio,因此最好使用插件,但该程序是使用 gcc 编译的。


编辑:像 CodeAnalyst 和 CacheGrind 这样的分析器似乎只在程序执行后才做这种事情,就像分析器会做的那样,但我更感兴趣的是了解逐步执行的行为。

例子

Code Line 1;  // break here and show which variables are currently stored where.
Code Line 2;
for(int i=0; i<some_var; i++) {
    Code Line 3;  // break here and compare cache contents.
}

最佳答案

恐怕您无法在运行时直接查看缓存状态,因为查看行为,尤其是涉及断点或管理此检查的某些代码时,会对缓存产生很大影响状态,实际上摧毁了你试图检查的东西。更糟糕的是 - 假设您可以使用一些简单的代码获得某种缓存图片或转储 - 但事实并非如此。

事实上,即使您在给定时刻神奇地获得了缓存状态的图片,几微秒后也不太可能有任何意义,因为页面映射可能不断变化,行被获取并从缓存中丢弃一直缓存,可能会刷新整个缓存。事实上,核心或 CPU 甚至可能会因短暂的断电而停止,并在此过程中自动刷新缓存中的所有内容。

这里有 3 种以非侵入方式查看缓存上下文的方法:

缺点是这些都不能保证重新生成与您在真实 CPU 上完全相同的场景。缓存模拟器是不现实的,因为它简化了对单个线性流的所有访问,忽略了例如由于分支预测错误而被刷新的真实 CPU 中的那些。缺少计时元素也可能会改变替换策略的行为方式,并给您带来不同的结果。这不太可能成为问题,它应该只在真正的极端情况下有所作为,但请记住这一点。时序模拟器更逼真,并且有更好的机会重现您的问题,但没有一个可用的模拟器必然会模拟您的 CPU 所拥有的完全相同的微体系结构。不过,您可以将它们配置为尽可能接近。

  • 使用内部 CPU 性能计数器跟踪缓存相关统计数据。这为您提供了真实的画面,但不幸的是提供了较少的可见性,绝对不是实时的。一些分析器(包括 Vtune 等)可以为您完成繁重的工作,并呈现这些随着时间的推移采样的统计数据,这可能更有用。

  • 添加专用代码,以便在您要检查缓存内容时以编程方式调用该代码。然后,此代码可以执行一些(有限的)检查,例如使用定时查找猜测缓存中是否存在特定行。它非常复杂,但如果您在那里寻找特定的线路,可能会更适合。我只是注意到我以一种非侵入性的方式写作 - 从头开始​​,这种方式当然是非常侵入性的。

关于c++ - 在调试期间显示 cpu 缓存和寄存器内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23799938/

相关文章:

audio - 调试脚本

url - 谷歌图表显示问题

c++ - 需要帮助开始使用 Boost.Python

c++ - 我应该使用 boost 快速池分配器进行跟踪吗?

c# - 内存映射文件 : How much memory can be allocated for files

iphone - 假人的 ARC 保留周期

c++ - RegExp 查找不以特定单词结尾的特定字符串

c++ - if 语句有问题。 (新程序员。)

c++ - 为什么在返回从函数的返回类型派生的类型的本地对象时不选择 move 构造函数?

android - 在播放之前如何在Android中获取音频文件的幅度?