【问题标题】:different code behaviour with and without debugger at C++ .net4在 C++ .net4 中使用和不使用调试器的不同代码行为
【发布时间】:2010-08-19 10:50:33
【问题描述】:

我有从 .net3.5 迁移到 .net4.0 的 WPF 应用程序。此应用程序使用一个旧的 C++ 库(据我了解,这是混合模式库,表示托管-非托管)。库移至 .net4 环境,并在回调调用时出现一些奇怪的错误:

            if (m_pCANCallback)
            m_pCANCallback(m_pCANCallbackPtr, &rxData); 

如果附加了 VS 调试器,它会正确传递 rxData 如果我在没有调试器的情况下启动应用程序,它会传递 NULL。

这里是回调函数定义:

void USBCANAdapter::CANDataCallback( void *pThis, RxData *pRxData )

因此,在此函数的主体中,pRxData 等于 NULL,但它仅在没有调试器且仅在 .net4 环境中发生。

以防万一,回调初始化:

m_pUsbCan->DefineCANMsgCallback( (TUsbCallback)USBCANAdapter::CANDataCallback );

    void CUsbFt::DefineCANMsgCallback(TUsbCallback pCallback, void *pCallbackPtr)
{
    m_pCANCallback = pCallback;
    m_pCANCallbackPtr = pCallbackPtr;
}

非常感谢您的任何建议!

【问题讨论】:

  • 真的是 Debugger presentDebugger 不存在 还是 Debug configRelease config ?
  • 在 Debug config 或 Release config 没有 Debugger 的情况下问题重现。因此,存在调试器与不存在调试器是正确的
  • 将编译器的警告级别设置得尽可能高。现在确保代码编译时没有警告。问题会消失的。
  • 谢谢,问题已解决,原因是内存损坏。现在我明白了这个建议的价值。

标签: .net c++ .net-4.0 clr debugging


【解决方案1】:

根据我的经验,100% 的情况下,在调试器中运行某些东西而在调试器之外失败的原因是函数本地数组溢出。

更新:例如,做这样的事情会导致这个问题:

 USBCANAdapter::CANDataCallback( void *pThis, RxData *pRxData ) 
 {
       char title[5];
       strcpy(title, "1234567890");
       // :
 }

(或者超时可能在调用例程中......)

【讨论】:

  • 詹姆斯,你能解释一下你的意思吗?
  • 哇,C++ 编程比我想象的还要硬核。谢谢你的回答
猜你喜欢
  • 2012-03-19
  • 1970-01-01
  • 2012-11-25
  • 2022-10-14
  • 1970-01-01
  • 2012-05-15
  • 2019-07-18
  • 2015-02-04
  • 1970-01-01
相关资源
最近更新 更多