不知道为什么使用 vs 2017 调试 c++代码的时候,没有 debug assertion 提示。比如以下代码
char buf1[256] = { 0 };
char buf2[128] = { 0 };
memcpy_s(buf2, 128, buf2, 256);
在 debug 配置下,执行 memcpy_s vs2017 直接退出调试状态,不会弹出出错的对话框。在 output 窗口中直接显示 program exit。
尝试将 vs2017 中的 exception 设置都勾上,没效果。
请问下这个问题怎么办? vs2017 哪里不对吗?
stackoverflow 类似问题: stackoverflow
1
ysc3839 2019-04-09 14:45:50 +08:00 via Android
单步汇编调试看看?
|
2
v2byy OP @ysc3839 额,我觉得是不是 vs2017 设置的问题啊,单步汇编是怎么搞?
像这种 access violation 的问题,vs2017 会抛出异常 ```c++ char* ch = NULL; *ch = 'p'; ``` 用相同的代码在 vs2013 里测试,会提示 debug assertion 对话框 |
3
tinykey 2019-04-09 17:37:14 +08:00 1
You'll have to use memcpy(), not memcpy_s() is you want to generate an AV. Memcpy_s() was designed to quickly terminate the program (without an exception) before anymore damage is being done.
check this link: https://social.msdn.microsoft.com/Forums/vstudio/en-US/22c19530-2137-4b2d-9c04-99205ff3c4e5/memcpys-access-violation?forum=vclanguage |
5
v2byy OP @tinykey 看了链接之后,我又重新去 msdn 上去看了下 memcpy_s 的文档,文档说 memcpy_s fail 会返回一个 error code。
所以应该不是这个原因。但是到是有个发现,可能是 parameter validation 的原因。继续看 parameter validation 的文档,在参数校验失败,会 invoke 一个 invalid_parameter_handler。 因为我在 vs2013 中测试 memcpy_s,是会有 debug asssertion 弹出的。我估计是不同的 c runtime 下设置的 invalid_parameter_handle 不相同。 经过测试,在 vs2017 下设置一个自定义的 handler,是可以弹出 debug assertion 提示的。 不知道 c runtime 在哪里设置了这个 handler 的,为什么 vs2017 带的 universal crt 为啥要修改这个设定呢? |