Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么VS2013的调试器会在一行代码的两个不同地址上放置两个断点?_C++_Debugging_Visual Studio 2013_Breakpoints - Fatal编程技术网

C++ 为什么VS2013的调试器会在一行代码的两个不同地址上放置两个断点?

C++ 为什么VS2013的调试器会在一行代码的两个不同地址上放置两个断点?,c++,debugging,visual-studio-2013,breakpoints,C++,Debugging,Visual Studio 2013,Breakpoints,我怀疑我们在VS2013中遇到了编译器错误。设置单个断点实际上是将断点插入代码的两个不同地址 我在源文件MessageServerManager.cpp的第89行设置了一个断点。下面是该部分代码的一个片段,它是类中的一个普通方法: 87: void MessageServerManager::setup_dsp_emulation() 88: { 89: auto dsp_emulation_setting = util::get_env_var("DSP_EMU

我怀疑我们在VS2013中遇到了编译器错误。设置单个断点实际上是将断点插入代码的两个不同地址

我在源文件MessageServerManager.cpp的第89行设置了一个断点。下面是该部分代码的一个片段,它是类中的一个普通方法:

87:     void MessageServerManager::setup_dsp_emulation()
88:     {
89:         auto dsp_emulation_setting = util::get_env_var("DSP_EMULATION");
90:         _emulating_dsp = !dsp_emulation_setting.empty();
91: 
92:         if (_emulating_dsp)
执行此操作时,VS2013的断点窗口中会出现一个断点。但是,当在关闭优化的情况下构建和执行代码时,顺便说一句,视图将更改为以下内容:

class MessageServerManager : public boost::basic_lockable_adapter < std::recursive_mutex >
{
public:
    inline static MessageServerManager& instance() { static MessageServerManager manager; return manager; }
    void start_dsp_facing_server();
private:
    MessageServerManager();
}
请注意,这两个断点位于不同的地址。当第一个断点被命中时,VS中突出显示的行是第89行,但是当查看反汇编时,它实际上在另一段代码中,即对象的构造函数中

因为它位于对象构造函数中,所以共享如何创建此对象可能是一个好主意。它是一个基本上如下所示的单体:

class MessageServerManager : public boost::basic_lockable_adapter < std::recursive_mutex >
{
public:
    inline static MessageServerManager& instance() { static MessageServerManager manager; return manager; }
    void start_dsp_facing_server();
private:
    MessageServerManager();
}
以下是位于错误位置的断点的反汇编代码。所示的C++代码是在StasyDSP.FraceGyServer上设置断点的方法,但是拆解代码明显不同,它是构造函数:

    87:     void MessageServerManager::setup_dsp_emulation()
    88:     {
    89:         auto dsp_emulation_setting = util::get_env_var("DSP_EMULATION");
011AAB8F  push        0  
011AAB91  mov         ecx,dword ptr [this]  
011AAB94  add         ecx,8  
011AAB97  call        std::shared_ptr<messaging::IMessageServer>::shared_ptr<messaging::IMessageServer> (010619C9h)  
011AAB9C  mov         byte ptr [ebp-4],1  
    90:         _emulating_dsp = !dsp_emulation_setting.empty();
011AABA0  push        0  
011AABA2  mov         ecx,dword ptr [this]  
011AABA5  add         ecx,10h  
011AABA8  call        std::unique_ptr<radian::SimpleThread,std::default_delete<radian::SimpleThread> >::unique_ptr<radian::SimpleThread,std::default_delete<radian::SimpleThread> > (0106E5CAh)  
011AABAD  mov         byte ptr [ebp-4],2  
    91: 
    92:         if (_emulating_dsp)
    93:         {
如果我查看断点的另一个位置的反汇编,该部分也显示了第89行,但它是正确的反汇编

这是在VS2013更新4,C++原生应用程序中,与Boost 1.5 .0和QT 5.3.1,32位链接。 以前有没有人见过这种情况,知道潜在的原因和可能的解决方案

我已经看到,并且我知道优化可以重新排序代码并导致奇怪的调试器行为,但是我已经批量转换了我的文件以确保它们有正确的行尾,并且我们已经关闭了优化


我将发布一个显示此行为的最小示例,但我无法用其他代码按需复制此行为。

您可能有两个不同的二进制文件,它们的PDB包含该行。我的开发伙伴已经检查过了。我已经在我的机器上执行了一次清理,但它仍然会发生哦,我应该提到这是在两台不同的开发机器上发生的。明天,我会把所有的东西都吹走,从源代码管理中抽出来,看看这是否会有所不同。再干净不过了。我已经完全删除了按源代码/生成目录,从版本控制复制了新的源代码,并重新生成了。我经历了完全相同的行为。