Visual Studio 2010 中的调试器最近指向错误的行和/或跳过行,我不知道这是为什么。这是一个 CUDA 项目,只发生在 CUDA 文件中。我注意到以下几点:
- 它总是发生在节目的同一部分。
- 它指向的线总是相同的,即不是随机的。
- 在罪魁祸首行之后放置额外的代码会改变它指向的行。
- 它只发生在
.cu
文件中。将代码移动到.cpp
文件不会重现问题。
我尝试过的:
- 清理并重建解决方案。
- 为 MSVC10 安装 SP1 并通过 Windows 更新进行所有可能的更新
- 将编译器设置为不在 Debug模式下对
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;
}
最佳答案
由于程序只包含 CPU 指令,而没有构造的类型的变量声明不包含任何指令,因此调试器不会就此停止。它只是执行指令,然后使用编译器提供的调试信息找到相关的源代码行。
关于c++ - Visual Studio 2010 调试器指向错误的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945143/