vs2017 c++ debug 时遇到未定义行为直接退出调试,不弹出 debug assertion 提示

2019-04-09 13:36:46 +08:00
 v2byy

不知道为什么使用 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

2677 次点击
所在节点    C
5 条回复
ysc3839
2019-04-09 14:45:50 +08:00
单步汇编调试看看?
v2byy
2019-04-09 15:32:10 +08:00
@ysc3839 额,我觉得是不是 vs2017 设置的问题啊,单步汇编是怎么搞?

像这种 access violation 的问题,vs2017 会抛出异常
```c++
char* ch = NULL;
*ch = 'p';

```

用相同的代码在 vs2013 里测试,会提示 debug assertion 对话框
tinykey
2019-04-09 17:37:14 +08:00
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
ysc3839
2019-04-09 18:16:19 +08:00
@v2byy 大概是 右键 显示反汇编。
v2byy
2019-04-10 09:31:26 +08:00
@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 为啥要修改这个设定呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/553337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX