了解ReactOS调试

Posted bcbobo21cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解ReactOS调试相关的知识,希望对你有一定的参考价值。

ReactOS debug(调试)

       看了N多ReactOS代码,总想调试一下,于是到wiki上去看了一下关于debug的方面的资料。主要有三种调试方式:Kdbg、GDB、WinDBG(http://www.reactos.org/wiki/Debugging)

1  Kdbg方式

这是ReactOS内建的调试机制,默认就是这种。但是Kdbg的调试客户端是什么呢?网上有篇文章说用fDebug,感觉太麻烦,后来弄了半天才知道原来是ReactOS Remote Debugger(RosDbg)。这个RosDbg的源码在svn://svn.reactos.org/reactos/trunk/tools/reactosdbg,是用C#写的。我用TortoiseSVN下载后再用VS2008编译通过,生成/reactosdbg/RosDBG/bin/x86/Debug/RosDBG.exe!Vmware的设置跟WinDBG内核调试一样,启动菜单选择"ReactOS (RosDbg)"

一切OK吧……

Kdbg命令参考:http://www.reactos.org/wiki/Kdbg,还有中断系统为“Tab+K”。

2 WinDBG方式

ReactOS对这种方式支持很有限。拷贝config.template.rbuild为config.rbuild,打开config.rbuild,修改为<property name="KDBG" value="0" />、<property name="_WINKD_" value="1" />,另外还要把win2003中的kdcom.dll拷到ReactOS中。重启系统,启动菜单选择"ReactOS (Debug)"。Vmware和WinDBG的设置跟双机内核调试一样。

原文链接:https://blog.csdn.net/better0332/article/details/4466893


fdebug 调试器使用

reactos 源码带了一个调试工具fdebug, 这个调试器原本是通过串口来连接reactos,但实际上这种方式很麻烦,必须要有两台机器。比较好的方式就是通过虚拟机用pipe方式来调试,但首先就要修改fdebug的源代码,改为通过pipe来连接,打开rs232.c 文件,找到Rs232OpenPortWin32函数:

BOOL Rs232OpenPortWin32(TCHAR* CommPort)
{
    TCHAR    PortName[MAX_PATH];
    DWORD    ErrorCode;
 
    // First check and make sure they don't already have the
    // OBD2 connection open. We don't want to open things twice.
    if (hPortHandle != NULL)
    {
        _tprintf(TEXT("Port handle not NULL. Must be already open. Returning FALSE...\\n"));
        return FALSE;
    }
 
    _stprintf(PortName, TEXT("\\\\\\\\.\\\\%s"), CommPort);
 
    hPortHandle = CreateFile(PortName,
                            GENERIC_READ|GENERIC_WRITE,
                            0,
                            0,
                            OPEN_EXISTING,
                            0,
                            0);
 
    if (hPortHandle == INVALID_HANDLE_VALUE)
    {
        hPortHandle = NULL;
        ErrorCode = GetLastError();
 
        _tprintf(TEXT("CreateFile(\\"%s\\") failed. GetLastError() = %lu.\\n"), PortName, ErrorCode);
 
        return FALSE;
    }
 
    return TRUE;
}
这儿可以把PortName 改为\\\\\\.\\\\pipe\\com1;

然后在fdebug.c 的Rs232Thread函数处:

VOID Rs232Thread(VOID* Parameter)
{
    BYTE    Byte;
    TCHAR    String[MAX_PATH];
    MSG        msg;
    DWORD    dwNumberOfBytesWritten;
 
          UNREFERENCED_PARAMETER(Parameter);
 
    dwThreadId = GetCurrentThreadId();
 
    if (!Rs232OpenPortWin32(strComPort))
    {
        MessageBox(hMainWnd, TEXT("Error opening port!"), TEXT("Error"), MB_OK|MB_ICONSTOP);
        bConnected = FALSE;
        return;
    }
 
    //_stprintf(String, TEXT("%s,n,8,1"), strBaudRate); 注释掉这儿
    //if (!Rs232ConfigurePortWin32(String))
    //{
    //    MessageBox(hMainWnd, TEXT("Error configuring port!"), TEXT("Error"), MB_OK|MB_ICONSTOP);
    //    bConnected = FALSE;
    //    return;
    //}                                                注释掉这儿
 
    while (bConnected)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_CHAR)
            {
                Rs232WriteByteWin32((BYTE)msg.wParam);
 
                if (bLocalEcho && msg.wParam != (WPARAM)TEXT('\\r'))
                {
                    PostMessage(hDisplayWnd, WM_CHAR, (WPARAM)msg.wParam, (LPARAM)0);
 
                    if (hCaptureFile)
                    {
                        WriteFile(hCaptureFile, &msg.wParam, sizeof(TCHAR), &dwNumberOfBytesWritten, NULL);
                    }
                }
            }
        }
 
        if (Rs232ReadByteWin32(&Byte))
        {
            _stprintf(String, TEXT("%c"), Byte);
 
            PostMessage(hDisplayWnd, WM_CHAR, (WPARAM)String[0], (LPARAM)0);
 
            if (hCaptureFile)
            {
                WriteFile(hCaptureFile, &String[0], sizeof(TCHAR), &dwNumberOfBytesWritten, NULL);
            }
        }
    }
 
    dwThreadId = 0;
    Rs232ClosePortWin32();
}


注释掉对 Rs232ConfigurePortWin32() 的调用。因为对pipe来说,是不用配置这样的参数的,然后就可以编译了。

默认情况下,fdebug并不会编译的(看来reactos本身是想淘汰掉这种调试工具,因为现在有了其他调试工具ReactosDBG)

打开freeldr目录下的freeldr.rebuild,增加如下的命令:

<directory name="fdebug">
 <xi:include href="fdebug/fdebug.rbuild" />
 </directory>

保存退出,在编译环境下执行:

make  freeldr_fdebug

这样就可以用了

原文链接:https://blog.csdn.net/sstower/article/details/6759891


 

以上是关于了解ReactOS调试的主要内容,如果未能解决你的问题,请参考以下文章

VS2012调试ReactOS源码环境搭建4 - 生成ReactOS镜像和VS解决方案成功

VS调试ReactOS源码环境搭建5 - VS通过串口连接虚拟机

什么是RosBE及其安装使用第一次生成ReactOS的VS工程失败

初步了解设备IO方式和ReactOS MDL实现

reactos操作系统实现 2

VS2012+WDK8.0搭建WDF驱动开发环境