drmingw, MINGW的后调试工具

分享于 

10分钟阅读

GitHub

  繁體 雙語
Postmortem debugging tools for MinGW.
  • 源代码名称:drmingw
  • 源代码网址:http://www.github.com/jrfonseca/drmingw
  • drmingw源代码文档
  • drmingw源代码下载
  • Git URL:
    git://www.github.com/jrfonseca/drmingw.git
    Git Clone代码到本地:
    git clone http://www.github.com/jrfonseca/drmingw
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/jrfonseca/drmingw
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    博士

    Build StatusBuild statusCoverage Status

    Dr。net是一个基于java的Just-in-Time ( JIT ) 调试器调试器。 当应用程序引发未处理的异常时,Dr。 MINGW 将自身附加到应用程序并收集有关异常的信息,使用可用的调试信息。

    MINGW 博士可以在Gnu编译器生成的格式- 和由Microsoft编译器生成的PDB文件中读取调试信息。 它依赖于 DbgHelp库插件,通过微软工具解析模块中的符号。

    解析符号和转储堆栈回溯的功能作为dll提供,因此它可以嵌入到你的应用程序/工具中。

    下载

    安装

    你应该下载和安装 Windows 64位( 它将处理 64位和 32位应用程序)的64位二进制文件,或者为 Windows 32位的32位版本。

    安装输入

     
    drmingw -i
    
    
    
     

    MINGW 将通过写入系统注册表将自身作为JIT调试器进行 register 调试。 确保你拥有管理员权限。 有关如何工作的更多信息,请参见

    如果安装成功,则应显示以下消息框:

    Install

    若要启用其他选项,必须将它的设置为 -i 选项。 比如,

     
    drmingw -i -v
    
    
    
     

    用法

    你可以轻松地尝试。 MINGW 通过构建和运行包含的示例。 根据你的Windows 版本,你将看到一个熟悉的对话框:

    Exception

    如果你请求调试该程序,则。 MINGW 将附加到错误应用程序,收集有关异常的信息,并显示对话框

    Sample

    要解决这些问题,需要使用调试信息编译应用程序。 如果地址在没有调试信息的DLL中,它将解析为导出的导出符号。

    命令行 选项

    下表描述了 Dr。 MINGW 命令行选项所有命令行选项都区分大小写。

    短动作
    -h--help打印帮助并退出
    -V--version显示版本并退出
    -i--install安装为默认的JIT调试器
    -a--auto自动启动( 使用-i或者的--install ) )
    -u--uninstall卸载
    -p pid--process-id= pid附加到具有给定标识符的进程
    -e 事件--event= 事件在附加进程后发出事件信号
    -b--breakpoints将断点视为异常
    -v--verboseVerbose 输出

    MgwHelp

    MgwHelp库目的是为,库提供一个降级,理解 MINGW 符号。 它提供与DbgHelp库相同的接口,但是它能够读取 MINGW 编译器/连接器生成的调试信息。

    下面的Dr.MinGW 和ExcHndl使用MgwHelp来查找符号。

    但希望它最终将被第三方 Windows 开发工具(。像调试器,分析器,等等 ) 使用,以轻松解析由 MINGW 工具链生成的二进制文件上的符号。

    MgwHelp依赖 libdwarf 来读取DWARF调试信息。

    注意:它仍在进行中,并且只导出一个限定数量的符号。 所以它还不是一个完整的解决方案,

    ExcHndl

    exchndl.dll 是一个可以嵌入的异常处理程序。 它产生类似于Dr的输出。 MINGW,但它可以捆绑到你的应用程序中。 异常处理例程运行在错误应用程序的同一进程上下文中。

    如果你将ExcHndl部署到自己的程序中,你可以拥有几乎相同的异常信息,你可以。 MINGW,但不需要最终用户安装 Dr。 已经安装 MINGW。

    用法

    你可以通过以下方式使用 ExcHndl:

    • exchndl.dllmgwhelp.dlldbghelp.dllsymsrv.dllsymsrv.yes 包含到应用程序二进制文件中

    • 链接程序时将 -lexchndl 传递给 GNU LD

    • 从你的主程序调用 ExcHndlInit()

    • 你还可以通过调用导出的ExcHndlSetLogFileNameA 入口点来覆盖报表位置。

    你也可以通过仅仅调用 LoadLibraryA("exchndl.dll") 来调用,但不再推荐使用 ExcHndl。

    示例

    样例 sample.exe 应用程序使用上面的第二。 将上面提到的所有dll复制到可执行文件目录。 运行它时,即使在出现一般保护错误对话框之前,它将写入 sample.RPT 文件的错误报告。

    以下是 sample.RPT的外观:

    
    -------------------
    
    
    
    Error occurred on Tuesday, June 25, 2013 at 08:18:51.
    
    
    
    z:projectsdrmingwsamplesample.exe caused an Access Violation at location 74D2ECC0 in module C:Windowssyswow64msvcrt.dll Writing to location 00000001.
    
    
    
    Registers:
    
    
    eax=00003039 ebx=00000064 ecx=00000001 edx=0028fe50 esi=00003039 edi=0000006f
    
    
    eip=74d2ecc0 esp=0028fc5c ebp=0028fe30 iopl=0 nv up ei pl nz na pe nc
    
    
    cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010202
    
    
    
    AddrPC Params
    
    
    74D2ECC0 0028FE50 00403064 00000000 msvcrt.dll!_strxfrm_l
    
    
    74D2EDC8 74D2E991 00403064 00000000 msvcrt.dll!sscanf
    
    
    74D2ED67 00403067 00403064 00000001 msvcrt.dll!sscanf
    
    
    004013DE 00000008 60000000 40166666 sample.exe!Function [z:projectsdrmingwsample/sample.cpp @ 12]
    
    
    00401D3E 00000004 40B33333 0028FF08 sample.exe!Class::StaticMethod(int, float) [z:projectsdrmingwsample/sample.cpp @ 17]
    
    
    00401D5E 00401970 00714458 0000000C sample.exe!Class::Method() [z:projectsdrmingwsample/sample.cpp @ 21]
    
    
    004013F9 00000001 00572F38 00571B38 sample.exe!main [z:projectsdrmingwsample/sample.cpp @ 27]
    
    
    004010FD 7EFDE000 F769D382 00000000 sample.exe
    
    
    77269F42 00401280 7EFDE000 00000000 ntdll.dll!RtlInitializeExceptionChain
    
    
    77269F15 00401280 7EFDE000 00000000 ntdll.dll!RtlInitializeExceptionChain
    
    
    
    

    CatchSegv

    MINGW 还包括一个 Windows 实用程序 catchsegv 端口,它允许你运行一个程序,在任何致命异常上转储堆栈回溯。 MINGW的catchsegv博士有其他功能:

    • 将收集并转储所有 OutputDebugString 消息到 stderr

    • 如果应用程序创建模式对话框,则将补漏白( 比如。 MessageBox )

    • 将跟随所有子进程

    • 允许指定超时时间

    上一切都使医生。 MINGW的catchsegv非常适合测试自动化。

    下面是如何使用它的方法:

    
    usage: catchsegv [options] <command-line>
    
    
    
    options:
    
    
     -? displays command line help text
    
    
     -v enables verbose output from the debugger
    
    
     -t <seconds> specifies a timeout in seconds
    
    
     -1 dump stack on first chance exceptions
    
    
    
    

    常见问题解答

    为什么我从你的例子中获得了不同的堆栈跟踪?

    确保你不使用 Dr.MinGW 和exchndl同时--似乎会干扰前者的一些晦涩的原因。

    :编译时应该向gcc传递哪些选项

    这里选项是必需的生成合适的结果是:

    • -g: 生成调试信息

    • 收费:在某些架构中使用帧指针( 默认情况下禁用帧指针使用,在某些架构中禁用,但在没有它的情况下可能不可能使用调用堆栈)

    你可以选择更详细的调试信息,比如,-g3-ggdb。 但到目前为止,我看到的没有证据显示这将导致更好的结果,至少至少在 Dr.MinGW 关注。

    为什么报告的源代码行总是在调用之后?

    调用者将返回的 IP地址放在堆栈上。 因这里,我们查找地址的源代码不是调用的行,而是立即获取调用的行。

    我应该在哪里放置 *.PDB 文件?

    MINGW 博士使用DbgHelp来处理. PDB 文件,因此它具有相同的行为。

    如果在构建的机器上进行测试,则通常需要执行任何操作。 否则,你需要知道. PDBs 通过 _NT_SYMBOL_PATH 环境变量的位置。

    如何从挂起的进程获得堆栈跟踪?

    
    drmingw -b -p 12345
    
    
    
    

    或者

    
    drmingw -b -p application.exe
    
    
    
    

    链接

    相关工具

    建议阅读


    tool  pos  POST  DEB  debug  调试  
    相关文章