了解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


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值