首页 > 解决方案 > MSVC 2008,调试过程,无法调试

问题描述

我已经在这个项目上工作了一段时间,它是一个旧版 DLL,我的职责是使其适应新版本的库。

我在 Properties / C/C++ / Preprocessor / Preprocessor Definitions 中定义的构建中添加了一个定义

我添加的定义称为 CLSOPENLDV,该行如下所示:

    CLSOPENLDV;SP_DEBUG;WIN32;_WINDOWS;_USRDLL;

这用于工作,在我的代码中,我使用定义来测试和切换代码:

    #pragma once

    #if defined(CLSOPENLDV) && !defined(CLSOPENLDV_H)
        #define CLSOPENLDV_H
        #pragma comment(lib, "ldv32")
        ...
    #endif

这一切都可以正常工作,上周我不得不切换回原始版本,这是从属性中删除常量的简单案例,但是现在我想回到原来的位置,但由于某种原因我不能,即使常量回到了属性中,预处理器也没有被构建识别,代码在上面的#if定义测试中是灰色的,我真的不知道为什么?

这可能与预编译头文件(pch)有关吗?

[编辑] 实际上问题不是 CLSOPENLDV 独有的,其他定义 SP_DEBUG 也没有通过构建,并且此定义中包含的任何调试语句都未启用。

[Edit2] 我在调试器中设置了断点,但它也没有达到这些断点,这一切都在工作,有些东西从根本上被破坏或禁用了。

[Edit3] 这是一个比我最初认为的更根本的问题,我根本无法调试项目......我附加到进程,但我的断点都没有被命中。我在“输出”窗格中看到很多首次更改异常,但不知道在哪里查看,因为它只是提供地址。

[Edit4] 仍在试图弄清楚发生了什么,下面是运行 DLL 时的转储,我所做的唯一修改是对 Debug / Exceptions / C++ Exceptions 进行了修改,我选中了 Thrown 复选框,所以它现在停止并出现异常对话框第一个例外:

“Edwards.Scada.AgentService.exe”:已加载“C:\Program Files\Edwards\Agent Service\Edwards.Scada.AgentService.exe”,二进制文件未使用调试信息构建。'Edwards.Scada.AgentService.exe': 加载'C:\Windows\System32\ntdll.dll' 'Edwards.Scada.AgentService.exe': 加载'C:\Windows\System32\mscoree.dll' 'Edwards.Scada .AgentService.exe': 加载'C:\Windows\System32\kernel32.dll''Edwards.Scada.AgentService.exe': 加载'C:\Windows\System32\KernelBase.dll''Edwards.Scada.AgentService.exe ': 已加载'C:\Windows\System32\apphelp.dll''Edwards.Scada.AgentService.exe': 已加载'C:\Windows\apppatch\AcLayers.dll''Edwards.Scada.AgentService.exe': 已加载' C:\Windows\System32\msvcrt.dll''Edwards.Scada. exe': 加载'C:\Windows\System32\cryptbase.dll''Edwards.Scada.AgentService.exe': 加载'C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Core\c3edb3947295bb8762d800c029930c15\System.Core。 ni.dll''Edwards.Scada.AgentService.exe':加载'C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Configuration\2817463703ac432e3bbf54586b3d6b8b\System.Configuration.ni.dll''Edwards.Scada.AgentService.exe ': Loaded 'C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Xml\9d354ba04e2414d763e9dea657f52fff\System.Xml.ni.dll' 线程'Win32 Thread' (0x2084) 已退出,代码为 0 (0x0)。“Edwards.Scada.AgentService.exe”:已加载“ImageAtBase0x4890000”,未加载符号。“Edwards.Scada.AgentService.exe”:已加载“ImageAtBase0x48b0000”,未加载任何符号。“Edwards.Scada.AgentService.exe”:已卸载“ImageAtBase0x4890000”“Edwards.Scada.AgentService.exe”:已加载“C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Data\e6902bef5b9f4110e975dc92ff87e71d\System.Data.ni。 dll''Edwards.Scada.AgentService.exe':加载'C:\Windows\Microsoft.NET\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll''Edwards.Scada。 AgentService.exe': 加载'C:\Windows\System32\ws2_32.dll''Edwards.Scada.AgentService.exe': 加载'C:\Windows\System32\crypt32.dll''Edwards.Scada.AgentService.exe' :在 Edwards.Scada.AgentService.exe 中的 0x015e401a 处加载了“C:\Windows\System32\msasn1.dll”第一次机会异常:0xC0000005:访问冲突读取位置 0x00000000。' Edwards.Scada.AgentService.exe':已加载 'ImageAtBase0x4950000',未加载符号。“Edwards.Scada.AgentService.exe”:已加载“ImageAtBase0x4960000”,未加载符号。“Edwards.Scada.AgentService.exe”:已卸载“ImageAtBase0x4950000”线程“Win32 线程”(0x25d4)已退出,代码为 0(0x0)。线程“Win32 线程”(0x13d0) 已退出,代码为 0 (0x0)。“Edwards.Scada.AgentService.exe”:已加载“ImageAtBase0x50a0000”,未加载任何符号。“Edwards.Scada.AgentService.exe”:已加载“ImageAtBase0x50f0000”,未加载任何符号。“Edwards.Scada.AgentService.exe”:已卸载“ImageAtBase0x50a0000”“Edwards.Scada.AgentService.exe”:已加载“C:\Windows\assembly\NativeImages_v4.0.30319_32\System. exe': 加载'C:\Windows\System32\nsi.dll' 'Edwards.Scada.AgentService.exe': 加载'C:\Windows\System32\rasadhlp.dll' 'Edwards.Scada.AgentService.exe': 加载'C:\Windows\System32\IPHLPAPI.DLL' 'Edwards.Scada.AgentService.exe': 加载 'C:\Windows\System32\FWPUCLNT.DLL' 'Edwards.Scada.AgentService.exe': 加载'ImageAtBase0x4970000',未加载任何符号。“Edwards.Scada.AgentService.exe”:已加载“ImageAtBase0x50e0000”,未加载符号。'Edwards.Scada.AgentService.exe':已卸载 'ImageAtBase0x4970000' 'Edwards.Scada.AgentService.exe':已加载 'C:\Windows\assembly\NativeImages_v4.0.30319_32\SMDiagnostics\5415baffc9d9111d58c8fe05d4e50c8a\SMDiagnostics'E'E .Scada.AgentService.exe': 加载'C: \Windows\assembly\NativeImages_v4.0.30319_32\System.Servd1dec626#\71634b20929e9a6ed53d7acbffa0b93d\System.ServiceModel.Internals.ni.dll''Edwards.Scada.AgentService.exe':已加载'ImageAtBase0x4970000',未加载任何符号。“Edwards.Scada.AgentService.exe”:已加载“ImageAtBase0x5220000”,未加载任何符号。'Edwards.Scada.AgentService.exe':已卸载'ImageAtBase0x4970000''Edwards.Scada.AgentService.exe':已加载'C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Runteb92aa12#\dd6060246740eddfed31aeed179fb81f\System.Runtime。 .ni.dll''Edwards.Scada.AgentService.exe':加载'C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Web.Services\1150e9c52ad5088258dafbd0fce2ae07\System.Web.Services.ni.dll''Edwards. Scada.AgentService.exe':已加载“ImageAtBase0x5230000”,未加载任何符号。“Edwards.Scada.AgentService.exe”:已加载“ImageAtBase0x5280000”,未加载任何符号。“Edwards.Scada.AgentService.exe”:已卸载“ImageAtBase0x5230000”“Edwards.Scada.AgentService.exe”:已加载“C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Serv14259fd9#\f8ae5cc80236c0593f67d76495fccd46\System .ni.dll' Edwards.Scada.AgentService.exe 中 0x74372ea2 处的第一次机会异常:0xE0434352:0xe0434352。“Edwards.Scada.AgentService.exe”:已加载“C:\Windows\assembly\NativeImages_v4.0.30319_32\System.IdentityModel\43572b8748b627fcbeb032b3656f5810\System.IdentityModel.ni.dll”“Edwards.Scada.AgentService.exe”:已加载“ C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Net。

第一行非常混乱,我已经检查了几次项目构建,它是为调试而构建的。

[另一个编辑] 我已经从 SVN 获取了昨天工作的项目,并完全删除了现有项目,从 SVN 中提取了副本。我已经编译并测试了它,它现在崩溃了,就像昨天它工作的那样,我重新安装了 MSVC,安装了服务包并采取了一个工作项目并构建,但现在它没有调试和崩溃。

为什么?我还能尝试什么?

这是 stdafx.h 的内容:

#include "stdafx.h"

#ifdef _ATL_STATIC_REGISTRY
    #include <statreg.h>
    #include <statreg.cpp>
#endif

#include <atlimpl.cpp>

这是来自 C/C++ 的命令行:

    /Od 
    /I "..\..\..\Legacy Common Files" 
    /I "..\nodetalk2\include"
    /I "..\..\..\..\..\Include" 
    /D "CLSOPENLDV"
    /D "SP_DEBUG"
    /D "WIN32"
    /D "_WINDOWS"
    /D "_USRDLL"
    /D "_VC80_UPGRADE=0x0600"
    /D "_WINDLL" 
    /D "_MBCS"
    /FD /EHsc /MDd /Yc"stdafx.h" 
    /Fp".\Debug/FsLonPlayer.pch"
    /Fo".\Debug/" 
    /Fd".\Debug/" 
    /W4 /nologo /c /Wp64 /Zi /TP /errorReport:prompt

[编辑] 输出的第一行是一条红鲱鱼,它实际上是指这个 DLL 所属的 EXE,该 DLL 是为调试而编译的,但是说它仍然没有解释为什么昨天它正在工作并且我可以在调试器中看到源代码并在断点处停止,今天我不能。

标签: c++preprocessorpch

解决方案


需要将其移至格式的答案。我认为@ZDF 建议您替换该行:

#if defined(CLSOPENLDV) && !defined(CLSOPENLDV_H)

#if defined(CLSOPENLDV)

虽然我正在这样做,但下一个建议可能不是一个长期的解决方案,但它应该提供一个数据点来帮助找出问题所在。创建一个新的头文件,其中只有这一行:

#define CLSOPENLDV

不要#include在任何地方包含它,而是打开项目属性,转到C/C++->并在字段Advanced中输入新头文件的完整路径。Forced Include File试一试,看看会发生什么。

另外,另一个(可能是愚蠢的)想法。您能否像一周半前那样从您的 SCM 存储库中提取项目文件的版本?

- 编辑 -

刚刚看到您对原始帖子的编辑。您是否检查了实际.cpp文件的属性,您可以通过查看项目本身的属性,验证两个定义是否存在,然后只需单击.cpp解决方案资源管理器中的文件即可轻松完成此操作。这会将您带到文件本身的相同属性页面。

我非常想知道那里展示了什么。


推荐阅读