V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
v2byy
V2EX  ›  C

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

  •  
  •   v2byy · 2019-04-09 13:36:46 +08:00 · 2692 次点击
    这是一个创建于 2080 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    5 条回复    2019-04-10 09:31:26 +08:00
    ysc3839
        1
    ysc3839  
       2019-04-09 14:45:50 +08:00 via Android
    单步汇编调试看看?
    v2byy
        2
    v2byy  
    OP
       2019-04-09 15:32:10 +08:00
    @ysc3839 额,我觉得是不是 vs2017 设置的问题啊,单步汇编是怎么搞?

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

    ```

    用相同的代码在 vs2013 里测试,会提示 debug assertion 对话框
    tinykey
        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
    ysc3839
        4
    ysc3839  
       2019-04-09 18:16:19 +08:00 via Android
    @v2byy 大概是 右键 显示反汇编。
    v2byy
        5
    v2byy  
    OP
       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 为啥要修改这个设定呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   999 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:18 · PVG 05:18 · LAX 13:18 · JFK 16:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.