读取访问权限冲突、解析多义性——Visual Studio C++中release调试问题

  • Post author:
  • Post category:其他


VS调试拖动崩溃问题,排除了for循环写法、内存改变、tuple访问与open mp多线程原因。

因为库的原因,不方便使用debug版本,写了一个独立demo复现

demo:

void vs_runtime_bug_demo() {

	std::vector<std::tuple<std::string, std::string>> file_list_to_process;

	file_list_to_process.push_back({ "aaa","aaa" });
	file_list_to_process.push_back({ "basdasd","xcvzxcv" });
	file_list_to_process.push_back({ "ddsd","zxcvzxcv" });

	for (auto& data : file_list_to_process) {
		//delete temp files
		std::string output_dir = std::get<0>(data);
		output_dir = std::get<1>(data);
	}

	//从第一个for强行拖到第二个for,按理说是不犯错的,但是实际在release模式下是会报错的
	for (auto& data : file_list_to_process) {
		//delete temp files
		std::string output_dir = std::get<1>(data);
	}

}


断点,从第一个for入口(或之前)直接拖动到第二个for入口

,报错

引发了异常: 读取访问权限冲突。

**<begin>$L1** 是 nullptr。


debug模式不复现!不拖动程序,顺序执行不复现!

release模式拖动断点行,弹出对话框

问题出在release优化

“解析多义性”对话框——属于VS自带问题“调试错误和警告”中的一种

当调试器无法选择要显示的位置时,将显示

Resolve Ambiguity

对话框。 例如,如果正在使用 C++ 模板,则可以从一个函数模板中创建多个函数。 如果调试器在模板的源位置停止,并且选择了

Go To Disassembly

,则调试器会有多个选项。 从模板创建的每个函数都有它自己的反汇编代码,而调试器不知道需要查看哪些代码。 利用

Resolve Ambiguity

对话框,您可以从所有对应位置的列表中选择所需的位置。


Choose the specific location

列出与命令对应的所有位置。


Address

显示每个函数的内存地址。


Function

显示每个函数的名称。


Module

显示包含函数对象代码的模块(EXE 或 DLL)。

避免方法:避免拖动,或避免使用release在此情形下拖动程序调试。



版权声明:本文为huqinweI987原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。