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