【问题标题】:Infinite loop when debugging in Visual Studio 2010在 Visual Studio 2010 中调试时出现无限循环
【发布时间】:2023-03-16 08:49:02
【问题描述】:

我对 VS2010 有一个奇怪的问题(构建一个大型 C++ 项目)。开始调试时,执行类似于无限循环。我在 main() 的第一行放了一个断点,但断点从未到达。我也试过 F11 进入 main(),但没有效果。任务管理器显示了我的应用程序的一个实例,控制台只显示“xxx.dll Symbols loaded”。我试图暂停执行,但我陷入了一些程序集循环,如果有人可以阅读,这里是程序集:

0000000077226129  lea         rdx,[rsp+88h]  
0000000077226131  xor         ecx,ecx  
0000000077226133  call        0000000077231650  
0000000077226138  mov         dword ptr [rsp+30h],eax  
000000007722613C  test        eax,eax  
000000007722613E  js          000000007725E73F  
0000000077226144  cmp         dword ptr [7731201Ch],r14d  
000000007722614B  je          0000000077226129  

谁能告诉我或至少指出我如何解决这个问题?

编辑:我发现当删除其中一个共享库(Point Gray Research 开发的 FlyCapture2)时,应用程序正常启动。似乎该库具有某种加载程序,该程序在执行 main() 之前调用。即使我解决了当前的问题,我仍然想知道:如何检测此类问题?

【问题讨论】:

  • 不显示程序集,显示调用堆栈。
  • 没有调用堆栈,应用程序甚至没有完成加载DLL的......
  • 那么有谁知道如何解决这个问题?

标签: visual-studio-2010 debugging infinite-loop


【解决方案1】:

我想我找到了问题所在。 在我的一个 DLL 中,我有一个单例类。在头文件中,我有一个 getter LogManager::instance() 和一个销毁器 void LogManager::destroyInstance()。该实例是在 .cpp 文件中定义的,但不是静态定义的,而是作为全局变量定义的

LogManager* sInstance = new LogManager;

instance() 函数只是返回了该变量,而 destroyInstance() 函数将其删除。所以我删除了全局变量并在 instance() 函数中创建了该实例

void LogManager::instance()
{
    static LogManager*  sInstance = 0;
        if(!sInstance)
            sInstance = new LogManager;
    return sInstance;
}

问题就解决了。所以我认为也许该 DLL 中的全局变量在加载该 DLL 期间导致了无限循环? 也许这对有类似问题的人来说是一个提示。

【讨论】:

  • 实际上,DLL 的初始化例程可以有任意数量的错误。实际的问题是,您如何告诉调试器“请在我的任何 DLL 或可执行文件的第一行代码处停止”。经过三年的经验,我想通了:) 你不能,除非你有源代码或至少调试 DLL 的符号。
  • 你仍然可以反汇编并尝试找出错误:) 但我想你是对的,这个错误很难修复而且很少见。
【解决方案2】:

如何正确连接DLL是一个大问题。它在应用程序之前,所以我们很难找到并解决它。但是当我有关于DLL的问题时,我也会寻找答案在互联网上。而且每个错误都有自己的序列号。这是关键。在“错误列表”中还写着“LNK**** ........”。所以我可以找到它,甚至根据别人的信息自己解决。

PS:你的代码叫做“机器指令”。它是计算机原理的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多