2.20.2009

Kernel Debugger - debugging Release Version Kernel.

原來 relesae 版也可以作 source debug (那 release 版的 "release" 意思是...)。
好像 CE 的 symbol 是放在 *.pdb,所以 release 的 image 不會變大
Follow Instruction : 在 Platform Setting 中 check:
  • Enable Kernel Debugger
  • Enable KITL
還有 bsp 宣告的對應 option.. 後,build release 版.. dowload and run bar image (NK.NB0).. 就可以了。

因為這樣的設置,一boot就會 enable kitl,所以 nk.nb0 會enable kitl,等待連線..
platform build 開啟 workspace (或是直接拖拉 NK.NB0 到 platformbuilder 中),作 "Attach Target" (Connect option 要設好)。就可以了...

然後你就可以用 File - Open 開啟 bsp source code,設break point...
但是在 run 的匙後設breakpoint 不會馬上生效,要break 後再 run 才 會生效


在 PUBLIC, PRIVATE (如果你有install share)的 source 也會 break 進去喔

這樣build 的 kernel (NK)。也可以燒到nandflash 中用eboot boot。

KITL 可以 configure 成 Active (boot 就啟動,所以會hang住),Passive (boot沒啟動,需要時再叫起來)。

叫起來的方法 (大概是.):(http://support.microsoft.com/kb/823606)
// ActiveKitl.c
//
#include <windows.h>
#include <halether.h>

int WINAPI WinMain (
HINSTANCE hInst,
HINSTANCE hInstPrev,
LPTSTR pszCmdLine,
int nCmdShow)
{
PUCHAR pBufferPool = (PUCHAR)malloc(64*1024);
UCHAR ClientId;

if (CallEdbgRegisterClient(&ClientId, "KTC", 0, 8, pBufferPool) == FALSE)
RETAILMSG(1, (TEXT("KITLRegisterClient failed.\r\n")));
else
RETAILMSG(1, (TEXT("KITLRegisterClient succeeded.\r\n")));

while(1)
/* do nothing */;

return 0;
}
.... 我沒試過.

試了..不會動..出現 " KITLRegisterClient Failed",然後 PC 出現 不可辨認的usb裝置。

TRACE CODE,發現在 BSP 中找不到 OALKitlInit( ).
結果是在 Platform\Common\SRC\Common\OAL\kitl.c 中。 (Platformbuilder的 code)
(thanks http://space.itpub.net/16803921/viewspace-506549 ..因為我一直找不到OALKitlInit())

裡面有
    // Start KITL in desired mode
if (!KitlInit((pArgs->flags & OAL_KITL_FLAGS_PASSIVE) == 0)) {
OALMSG(OAL_ERROR, (L"ERROR: OALKitlInit: KitlInit failed\r\n"));
goto cleanUp;
}
所以 follow 這個 code,在 initialize kitl arg 時加上這個 option:

KitlArgs->flags = OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_POLL | OAL_KITL_FLAGS_PASSIVE;

這樣,開機後,不會等待 kitl connection。
然後 run 上面的 ActiveKitl.exe,就會出現 waiting for connection..
之後再啟動 platform builder, attach device... 就啟動了 kitl.
然後就可以開啟 cesh.exe 下command 了。
不同的是:connect 後,target system 沒有停下來,也沒有 pause ,一樣繼續執行..

要打開 ceshell (CE target control),下 break 後才會暫停,然後就可以進行 source level debugger..

其實這個 kitl arg 是由 eboot 設定的。
在 eboot.c 的 main.c 中可以看到設定 passive 的 code,並且有 comment :
 user selected "passive" KITL (don't connect to the target at boot time)
所以,應該是..進入 eboot command menu, disable kernel debugger,然後開機,kernel 就會有這個 PASSIVE參數...根本就不用去改 initial kitl argument .

所以...

沒有留言: