了解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通过串口连接虚拟机