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

博客讨论了在Visual Studio(VS)中,使用Release模式进行调试时遇到的程序崩溃问题。具体表现为在拖动断点时,由于库的限制无法使用Debug版本,于是创建了一个独立的DEMO来复现问题。问题归因于Release模式下的优化,导致了‘解析多义性’的错误,即调试器在模板代码中无法准确定位。解决方法是避免在Release模式下拖动断点或者避免使用Release模式进行这类调试。
摘要由CSDN通过智能技术生成

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在此情形下拖动程序调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值