2011年9月12日星期一

[轉載]也來說說ReactOS的調試


作 者:ProgmBoy 
時 間:2009-02-16 22:36

鏈接:http://bbs.pediy.com/showthread.php?t=82194
By::ProgrammeBoy
Blog:http://hi.baidu.com/ProgrammeBoy

老鳥飛過,科普類….有錯的地方大家別笑,

  看ReactOS的源碼好多天了,許多windows下不明白的地方看看ReactOS的代碼也就知道差不多了...寫ReactOS的同志們可真是好人呀.想看linux但是還的學那一大堆命令....使用看reactos,照樣可以理解操作系統的精髓...還有就是編譯reactos在windows下,方便呀...,
  廢話不多說,看了半天的reactos的代碼,心裡躍躍欲試,想為reactos做點貢獻,但是前提是怎麼調試代碼呢?.. ....由於網上關於reactos的調試很少...reactos的wiki上只有寥寥無幾的幾篇,也只是介紹內核調試器的使用..作為菜鳥的我只知道他是用9幀串口來傳輸數據.並不知道用什麼來接收調試數據.和發送調試命令,在群裡看的老蔡的使用的調試工具是:

總覺得不好使......自己嘗試著瞎整..還真找出了點路子.(鑑於是自己瞎整,錯誤的概率也就很大,此文的目的是為調試reactos提供一個方向)

在reactos的論壇上搜"調試"的時候知道源碼中有個fDebug是好像是用來調試的.所以我就找了先下fDebug的的代碼.在D:\ReactOS\ReactOS_src\boot\freeldr\fdebug這個目錄下.
這裡我嗦下.源代碼的路徑別放到目錄中有空格的文件夾中,有時會導致不能編譯.例如,以前我把源碼放在了D:\Program Files\ReactOS_src\boot\freeldr\fdebug這個目錄下,在編譯時可能會發生錯誤.(至於為什麼?我就不嗦了)

  好了,回到正題.接下來就是編譯fDebug...,看了下fDebug的模塊名(怎麼看?打開fDebug下的fDebug.rbuild文件裡面有個module name=的字樣,後面的就是)當時我隨手打開了編譯環境,輸入"makex freeldr_fdebug",可是提示,mingw32-make: *** No rule to make target `fDebug'. Stop.,沒有次模塊,打開配置文件D:\ReactOS\ReactOS_src\boot\ freeldr\freeldr.rbuild,發現並沒有fDebug,那我們自己填,怎麼填?嗯是個問題.

follow me:來到這個模塊所在的主目錄下也就是D:\Program Files\ReactOS_src\boot\freeldr\,找到freeldr.rebuild文件打開添加下面的:


代碼:
<directory name="fdebug">
      <xi:include href="fdebug/fdebug.rbuild" />
</directory>
              
然後在編譯環境下再次輸入: makex freeldr_fdebug.等了會,出現

代碼:
[LD] output-i386\boot\freeldr\fdebug\fdebug.exe
[RSYM] output-i386\boot\freeldr\fdebug\fdebug.exe
的字樣OK編譯好了,我們在運行下:
這裡有兩個問題:
1,在哪運行呀?如果在windows下兼容嗎?
2,文件在哪呀?
答:(1)在windows下,因為我們要在windows下用fDebug和虛擬機調試,可能還會有人問兼容嘛?由於reactos設計的宗旨就是兼容windows,所以,reactos的應用程序幾乎都能在windows下運行!,而相反就不一定了,畢竟還在開發中嘛..
(2)文件在哪?正如編譯環境給你列出來的D:\ReactOS\ReactOS_src\ output-i386\boot\freeldr\fdebug\fdebug.exe下就能找到
編譯好了,我們來調試吧,先嗦下,調試環境,我類似於windbg + Vmware, 首先在虛擬機中裝ReactOS,怎麼裝我就不再嗦了,他的老家的論壇上有,然後打開虛擬機的設置->添加硬件-->串口使用命名管道..其餘默認就行..
呵呵,開始調試嘍,打開虛擬機.以調試模式運行Reactos(就是一進系統有好幾個選項我們選第二個(即ReactOS (Debug))),打開fDebug,如圖:

唉,白呀,打開”文件””Connect”,在端口那輸入” \\.\pipe\com_1”下面默認,確定
提示

暈,怎麼回事?用windbg就可以啦.打開源碼看看,(有源代碼就是好,^_^);這個程序的代碼很少.
看到這,就知道怎麼回事了(注意這段在D:\ReactOS\ReactOS_src\boot\freeldr\fdebug\rs232.c文件中):
              
代碼:
  _stprintf(PortName, TEXT("\\\\.\\%s"), CommPort);
  hPortHandle = CreateFile(PortName,
              GENERIC_READ|GENERIC_WRITE,
              0,
              0,
              OPEN_EXISTING,
              0,
              0);
  
馬上將port名改成pipe\com_1,可是又出錯了:

接著看代碼,這裡(在同目錄下的fDebug.c中):
        
代碼:
  _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;
  }
接著看看這個函數Rs232ConfigurePortWin32(同目錄下的rs232.c中):

代碼:
BOOL Rs232ConfigurePortWin32(TCHAR* DeviceControlString)
{
  DCB dcb;
  DWORD ErrorCode;

  memset(&dcb, 0, sizeof(DCB));
  dcb.DCBlength = sizeof(dcb);
  if (!BuildCommDCB(DeviceControlString, &dcb))
  {
    ErrorCode = GetLastError();
    _tprintf(TEXT("BuildCommDCB() failed. GetLastError() = %lu.\n"), ErrorCode);
    return FALSE;
  }
  if (!SetCommState(hPortHandle, &dcb))
  {
    ErrorCode = GetLastError();
    _tprintf(TEXT("SetCommState() failed. GetLastError() = %lu.\n"), ErrorCode);
    return FALSE;
  }
  // Set the timeouts
  if (!Rs232SetCommunicationTimeoutsWin32(MAXDWORD, 0, 0, 0, 0))
  {
    return FALSE;
  }

  return TRUE;
}
查了下msdn沒多大用,(有興趣的自己看),去掉.將fDebug.c中的那段去掉.
這裡也說下:這個程序的作者也真夠馬虎的點”connect”出錯後,也不知道將disConnect變為禁用將connect變為可用,害的我每次都得重新運行下程序,我們改過來:
在連接失敗的地方加上

代碼:
    EnableFileMenuItemByID(IDM_FILE_DISCONNECT, FALSE);
    EnableFileMenuItemByID(IDM_FILE_CONNECT, TRUE);
就行了
趕緊試了下….成功了:
如下:

呵呵.接著去他老家的論壇看了看Kernel_Debug的用法,wiki上都有我就不多說了.
在這裡: http://www.reactos.org/wiki/index.php/Kdbg
對了這裡按Tab + K 鍵中斷進行調試,和softice似的,輸命令的時候必須將窗口切入到ReactOS中再輸入,雖然不是在fDebug中輸入的加上鼠標什麼的都不管事但是ReactOS會將命令通過串口傳過來.
我們試試查看寄存器:
輸入:regs
顯示如圖:

注意:調試必須是內核帶調試的版本,怎麼編譯調試版本,WIKI上都說了,大家可以參考


結束語:這裡僅僅是指名了個方向,具體還要大家慢慢的研究,探索…..
老鳥飛過
也不知道是放在編程這塊呀,還是放在調試那塊,想了下編程這塊常來放在這吧

附上改過後的fDebug

没有评论:

发表评论