【问题标题】:Windows : Print stacktrace in case of a coredump during CI testingWindows:在 CI 测试期间出现核心转储时打印堆栈跟踪
【发布时间】:2019-08-01 16:48:26
【问题描述】:

我已经搭建了我公司的Gitlab-CI持续集成系统的一部分。 我们每晚在所有平台上运行构建和测试。 在 Linux 和 MacOS(分别使用 GDB 和 LLDB)崩溃的情况下,我设法打印了堆栈跟踪。 我也在尝试在 Windows 上这样做,但我还没有找到如何...

核心转储生成

in the documentation 所说,我首先尝试启用 Windows 错误报告。它适用于默认设置,但我希望在可执行目录中生成核心转储......

我尝试将“%CD%”放入 DumpFolder 键(类型 REG_EXPAND_SZ,我检查过),但它不起作用... 我现在正试图了解如何使用 WinDbg 生成 coredump,但我仍然无法弄清楚如何。

堆栈跟踪显示

当 coredump 将在正确的文件夹中生成时,我需要弄清楚如何打印堆栈跟踪...您是否已经知道用于此的命令(这对我来说是强制性的)?

powershell 脚本或基本命令都应该没问题。

编辑:

我可以很容易地在本地用windbg 打印生成的coredump 的堆栈跟踪。但是,由于某种原因,当作业由 Gitlab-CI 触发时,不会生成核心转储......是否有任何未记录的值可以添加到 Windows 错误报告键以生成核心转储,即使错误程序是通过启动的Gitlab-CI ? (如果我通过 SSH 启动它就可以了)

【问题讨论】:

    标签: windows windbg gitlab-ci stack-trace windows-error-reporting


    【解决方案1】:

    我怀疑%CD% 在这种情况下是否有效。 %CD% 可能会扩展到正在读取注册表项的进程的当前目录。这与可执行文件的目录不同。

    看看ProcDump-x 命令行选项可让您指定放置故障转储文件的目录。

    这对我有用:

    ..\procdump.exe  -e -x . SimpleCppCrash.exe -arg1 -arg2 -arg3
    

    我可以在故障转储中验证:

    0:000> !peb
    [...]
    CommandLine:  '"SimpleCppCrash.exe"  -arg1 -arg2 -arg3'
    [...]
    

    所以,可执行文件传递了参数。

    @blabb 已经回答了其余的问题:使用 cdb -c "<whatever>;q",如果您希望它持久,可以使用 -logo <logfile> 选项。

    单独使用 WinDbg/cdb 当然可以,但我不建议这样做。如果需要更详细地检查异常,最好保留故障转储文件。

    【讨论】:

    • 我尝试使用 ProcDump,但经过一些研究,我没有找到如何为我的崩溃测试仪提供参数。提供参数是强制性的,因为如果它们不存在,测试仪将不会启动。我尝试了以下命令(在安装 procdump 并将其添加到我的路径之后): procdump -ma -e -x %CD% my_tester --arg1 --arg2 我还尝试在引号中转义参数,或者将程序提供给 ProcDump启动和他的参数用引号括起来,但似乎 ProcDump 只是忽略了 exe 参数......你知道怎么做吗?
    • @Kyron:我怀疑使用%CD% 是否有帮助,我不知道在哪种情况下%CD% 会比. 更有用我使用..\procdump.exe -e -x . SimpleCppCrash.exe -arg1 -arg2 -arg3 并且参数已通过到可执行文件。查看更新的答案
    • 你说得对,我只是在我的命令中犯了一个错误......谢谢!
    【解决方案2】:

    %cd% 我认为会扩展到 windbg 启动的目录,而不是可执行文件所在的目录

    我认为您不能要求任何通用工具转储到任意目录

    使用windbg / cdb / kd创建转储检查windbg安装文件夹中的adplus(阅读adplus.doc)

    它需要一个 -O 参数,但这是单个目录而不是多个任意目录

    无论如何,只要您设法在您选择的目录中创建一个 .dmp 文件

    打印调用堆栈只需在windbg中加载转储并发出 kb 命令

    假设您不想查看所有可以在 powershell 中运行正则表达式匹配的加载内容

    F:\>dir /s /b *.dmp
    F:\mydmp.dmp
    
    F:\>powershell
    Windows PowerShell
    Copyright (C) Microsoft Corporation. All rights reserved.
    
    PS F:\> $foo = cdb -c "kb;q" -z .\mydmp.dmp
    PS F:\> $pattern = "Reading(.*?)quit:"
    PS F:\> [regex]::Match($foo,$pattern)
    
    
    Groups   : {0, 1}
    Success  : True
    Name     : 0
    Captures : {0}
    Index    : 1033
    Length   : 761
    Value    : Reading initial command 'kb;q' RetAddr           : Args to Child
                    : Call Site 00007fff`46466246 : 00000000`00000000 00007fff`464bd100 00007fff`464bd100 00007fff`464bd100 :
               ntdll!LdrpDoDebuggerBreak+0x30 00007fff`46453879 : 00000000`00000001 00000000`00000000 00000000`00000000
               00000000`00000001 : ntdll!LdrpInitializeProcess+0x1d92 00007fff`464056c3 : 00000000`00000000 00007fff`46390000
               00000000`00000000 00000041`08a21000 : ntdll!_LdrpInitialize+0x4e19d 00007fff`4640566e : 00000041`08cff780
               00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrpInitialize+0x3b 00000000`00000000 :
               00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!LdrInitializeThunk+0xe quit:
    
    
    
    PS F:\> exit
    
    F:\>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      相关资源
      最近更新 更多