【问题标题】:tracking down which translation unit internal compiler error occurred in跟踪哪个翻译单元内部编译器错误发生在
【发布时间】:2015-01-22 03:20:04
【问题描述】:

假设我正在构建一个相当大的代码库

我在一个命令中使用 Visual c++ 编译器中的一大堆编译器标志编译一大堆文件,如下所示:

CL.exe /c /I..\..\JuceLibraryCode /I..\..\JuceLibraryCode\modules /ZI /nologo /W4 /WX- /MP1 /Od /Oy- /D WIN32 /D _WINDOWS /D DEBUG /D _DEBUG /D JUCE_UNIT_TESTS=1 /D JUCER_VS2014_78A5021=1 /D JUCE_APP_VERSION=3.0.0 /D JUCE_APP_VERSION_HEX=0x30000 /D _MBCS /Gm- /EHsc /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /GR /Fo"Debug\\" /Fd"Debug\\vc140.pdb" /Gd /TP /analyze- /errorReport:prompt ..\..\Source\Main.cpp ..\..\Source\MainWindow.cpp ..\..\Source\IntroScreen.cpp ..\..\Source\Demos\AnimationDemo.cpp ..\..\Source\Demos\AudioLatencyDemo.cpp ..\..\Source\Demos\AudioPlaybackDemo.cpp ..\..\Source\Demos\AudioRecordingDemo.cpp ..\..\Source\Demos\AudioSettingsDemo.cpp ..\..\Source\Demos\AudioSynthesiserDemo.cpp ..\..\Source\Demos\Box2DDemo.cpp ..\..\Source\Demos\CameraDemo.cpp ..\..\Source\Demos\ChildProcessDemo.cpp ..\..\Source\Demos\CodeEditorDemo.cpp ..\..\Source\Demos\ComponentTransformsDemo.cpp ..\..\Source\Demos\CryptographyDemo.cpp ..\..\Source\Demos\DialogsDemo.cpp ..\..\Source\Demos\FontsDemo.cpp ..\..\Source\Demos\GraphicsDemo.cpp ..\..\Source\Demos\ImagesDemo.cpp ..\..\Source\Demos\JavaScript.cpp ..\..\Source\Demos\KeyMappingsDemo.cpp ..\..\Source\Demos\LiveConstantDemo.cpp ..\..\Source\Demos\LookAndFeelDemo.cpp ..\..\Source\Demos\MDIDemo.cpp ..\..\Source\Demos\MidiDemo.cpp ..\..\Source\Demos\MultithreadingDemo.cpp ..\..\Source\Demos\MultiTouch.cpp ..\..\Source\Demos\NetworkingDemo.cpp ..\..\Source\Demos\OpenGLDemo.cpp ..\..\Source\Demos\OpenGLDemo2D.cpp ..\..\Source\Demos\PropertiesDemo.cpp ..\..\Source\Demos\SystemInfoDemo.cpp ..\..\Source\Demos\TimersAndEventsDemo.cpp ..\..\Source\Demos\UnitTestsDemo.cpp ..\..\Source\Demos\ValueTreesDemo.cpp ..\..\Source\Demos\VideoDemo.cpp ..\..\Source\Demos\WebBrowserDemo.cpp ..\..\Source\Demos\WidgetsDemo.cpp ..\..\Source\Demos\WindowsDemo.cpp ..\..\Source\Demos\XMLandJSONDemo.cpp ..\..\JuceLibraryCode\BinaryData.cpp ..\..\JuceLibraryCode\modules\juce_audio_basics\juce_audio_basics.cpp ..\..\JuceLibraryCode\modules\juce_audio_devices\juce_audio_devices.cpp ..\..\JuceLibraryCode\modules\juce_audio_formats\juce_audio_formats.cpp ..\..\JuceLibraryCode\modules\juce_audio_processors\juce_audio_processors.cpp ..\..\JuceLibraryCode\modules\juce_audio_utils\juce_audio_utils.cpp ..\..\JuceLibraryCode\modules\juce_box2d\juce_box2d.cpp ..\..\JuceLibraryCode\modules\juce_core\juce_core.cpp ..\..\JuceLibraryCode\modules\juce_cryptography\juce_cryptography.cpp ..\..\JuceLibraryCode\modules\juce_data_structures\juce_data_structures.cpp ..\..\JuceLibraryCode\modules\juce_events\juce_events.cpp ..\..\JuceLibraryCode\modules\juce_graphics\juce_graphics.cpp ..\..\JuceLibraryCode\modules\juce_gui_basics\juce_gui_basics.cpp ..\..\JuceLibraryCode\modules\juce_gui_extra\juce_gui_extra.cpp ..\..\JuceLibraryCode\modules\juce_opengl\juce_opengl.cpp ..\..\JuceLibraryCode\modules\juce_video\juce_video.cpp

假设我得到一个 ICE,它位于某个源文件(翻译单元)显然直接或间接包含的某个头文件中,有没有办法直接追踪哪个翻译单元(源 .cpp 文件)或间接(通过其他一些头)包含发生 ICE 的头?

我在控制台中得到的输出似乎顺序混乱,以至于我无法通过查看它轻松找出哪个源文件包含具有 ICE 的标头。

【问题讨论】:

    标签: c++ visual-c++ msbuild internal-compiler-error


    【解决方案1】:

    如果您使用 cl /E 而不是 /c 进行编译,您将获得输出(默认在 stdout 上),并在文件首次合并到翻译单元时使用以下符号:

    #line 1 "...file [path and] name..."
    

    您可以查找与报告 ICE 的标头对应的 #line 1 行,然后回头查看之前的 #lines 以查看哪些文件直接和间接包含它。

    示例

    我下面的 cmets 是内联的,被 [[[三方括号]]] 包围。请记住在 #line.... 之后的行号“1”包含其他文件后推断源文件是新包含的还是被“返回”的。

     ~/dev/tr  cat h.h
    #pragma once
    h one
    h two
    h three
     ~/dev/tr  cat i.h
    #pragma once
    #include "h.h"
     ~/dev/tr  cat tr1.cpp
    #include "h.h"
    struct X { };
     ~/dev/tr  cat tr2.cpp
    #include "i.h"
    int main()
    {
        X x;
    }
     ~/dev/tr  cl /E tr1.cpp tr2.cpp
    Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    tr1.cpp
    #line 1 "tr1.cpp"
    #line 1 "c:\\home\\anthony\\user\\dev\\tr\\h.h"
            [[[ above line means prior context of tr1.cpp has #included h.h ]]]
    #pragma once
    h one
    h two
    h three
    #line 2 "tr1.cpp"
            [[[ above line means prior context of h.h "popped", returning to
                tr1.cpp at line 2 ]]]
    struct X { };
    tr2.cpp
    #line 1 "tr2.cpp"
    #line 1 "c:\\home\\anthony\\user\\dev\\tr\\i.h"
            [[[ i.e. tr2.cpp #included i.h ]]]
    #pragma once
    #line 1 "c:\\home\\anthony\\user\\dev\\tr\\h.h"
            [[[ i.e. prior context of i.h #included h.h ]]]
    #pragma once
    h one
    h two
    h three
    #line 3 "c:\\home\\anthony\\user\\dev\\tr\\i.h"
            [[[ i.e. i.h continues after the "include h.h" line ]]]
    #line 2 "tr2.cpp"
            [[[ i.e. tr2.cpp continues after the "include i.h" line ]]]
    int main()
    {
        X x;
    }
    

    【讨论】:

    • 谢谢。但是,当多个翻译单元直接或间接包含同一个标题时,这种策略似乎不起作用。
    • 感谢您的示例。但是假设同一个标题直接或间接地被 10 个翻译单元包含,仍然无法追踪 ICE 发生在哪个翻译单元中。当您只想查找直接或间接包含某些特定标题的所有翻译单元时,我相信您的方法有效。
    • @igbgotiz 如果 ICE 错误消息(您没有发布)仅列出头文件并且如您所说的那样被多次使用,那么它确实听起来像你有点卡住了。大多数人所做的是每个翻译单元调用一次编译器......这就是他们不会遇到这个问题的原因。我建议你打破你的构建过程。
    猜你喜欢
    • 2014-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多