【问题标题】:Visual Studio 2010 debugger points to wrong lineVisual Studio 2010 调试器指向错误的行
【发布时间】:2014-09-16 16:23:57
【问题描述】:

Visual Studio 2010 中的调试器最近指向错误的行和/或跳行,我不知道这是为什么。这是一个 CUDA 项目,只发生在 CUDA 文件中。我注意到以下几点:

  • 它总是发生在程序的同一部分。
  • 它指向的线总是相同的,即不是随机的。
  • 在罪魁祸首行之后添加额外代码会改变它指向的行。
  • 它只发生在.cu-files 中。将代码移至 .cpp 文件不会重现问题。

我尝试过的:

  • 清理并重建解决方案。
  • 为 MSVC10 安装 SP1 并通过 Windows 更新进行所有可能的更新
  • 将编译器设置为在调试模式下对C/C++CUDA C/C++ 使用优化
  • 手动删除所有创建的文件,然后从解决方案文件夹中重建。
  • 删除文件夹C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files
  • 仅使用源文件重新创建解决方案。
  • 禁用我的扩展程序。

我已设法将代码减少到以下可能重现问题的代码。请注意,此代码必须位于 .cu 文件中,并且很可能需要使用 C/C++ 的 cuda 编译器进行编译。包括 boost 并不是真正必要的,但这个例子确实显示了我遇到的问题。后面是一个较短的示例。

#include <boost/numeric/ublas/matrix.hpp>
using boost::numeric::ublas::matrix;

struct foo {
    foo() : mat(NULL) {}
    matrix<float>* mat;
};

bool func(foo *data) {
    bool status; // <- skipped line

    status = false;
    if (status) {
        std::cout << "test\n";
        return (status); // <- error reported here
    }

    int size = data->mat->size1(); // instead of here

    return status;
}

int main(int args, char* argv[]) {
    func(NULL); // force error by passing NULL pointer

    return 0;
}

有没有人知道如何解决这个问题或者这可能是如何发生的?不得不以这种方式调试非常烦人。


仅显示跳线的较短示例。无需外部库。

bool func() {
    bool status; // <- skipped line
    status = false;
    return status;
}

int main(int args, char* argv[]) {
    func();
    return 0;
}

【问题讨论】:

标签: c++ visual-studio-2010 debugging cuda nsight


【解决方案1】:

由于程序仅包含 CPU 指令,并且没有构造的类型的变量声明不包含指令,因此调试器不会停在那里。它只是执行指令,然后使用编译器提供的调试信息来查找相关的源代码行。

【讨论】:

  • 这只能解释为什么它会跳过行,但不能解释为什么这只发生在 .cu 文件中以及为什么它指向错误的行。在 .cpp 文件中,bool status; 的行不会被跳过。另请注意,优化已明确关闭。
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
相关资源
最近更新 更多