分類:
引擎研究
2011-12-04 20:49
1139人閱讀
收藏
舉報(bào)
- 以前用過lua, 調(diào)試時(shí)很痛苦. 當(dāng)然現(xiàn)在已經(jīng)有比較成熟的調(diào)試器了, 比如decoda
- 在沒有調(diào)試器之前都是怎么調(diào)試的呢?
- printf打印到控制臺(tái)之類的輸出窗口. 如果做了熱更新的話可以邊改邊看
- 輸入命令, 讓控制臺(tái)顯示結(jié)果. 對(duì)于C++來說控制臺(tái)是個(gè)很不爽的東西, 因?yàn)槊總€(gè)指令都要寫個(gè)解析函數(shù). 而腳本則可以直接把腳本語句當(dāng)指令敲進(jìn)去, 比如CsharpRepl
- 當(dāng)然, 最理想的情況還是能夠下斷點(diǎn), 單步跟蹤
- Unity使用MonoDevelop作為調(diào)試器, 幸運(yùn)的是, MonoDevelop和UnityDebugger插件都是開源的, 所以很容易山寨過來
- MonoDevelop有兩種方式啟動(dòng)調(diào)試:
- 直接執(zhí)行, 就像VS里按F5一樣.
- 掛接到進(jìn)程, 就是先啟動(dòng)程序, 然后把調(diào)試器掛上去. 這種對(duì)于腳本來說比較實(shí)用, 因?yàn)榭梢孕薷囊幌吕^續(xù)調(diào)試, 不用重新啟動(dòng)游戲
- Mono調(diào)試時(shí)是有個(gè)調(diào)試服務(wù)器的, 可以通過socket連接客戶端與服務(wù)器. 如果從MD里啟動(dòng), 則MD是調(diào)試服務(wù)器. 如果是Attach方式, 則游戲是那個(gè)server.
- 以Attach方式為例:
- int port = (int)(56000 + (GetCurrentProcessId() % 1000));
- char options[255];
- sprintf_s(options, 255, "--debugger-agent=transport=dt_socket,address=127.0.0.1:%d,server=y", port);
- char* args = options;
- mono_jit_parse_options (1, &args);
- mono_debug_init (MONO_DEBUG_FORMAT_MONO);
- MD那邊可以直接使用Unity的debugger插件, 當(dāng)然它只認(rèn)"unity"開頭的進(jìn)程:
 - 另外需要注意的是, 調(diào)試的DLL必須有mdb文件, 相當(dāng)于pdb文件. MD默認(rèn)是生成pdb文件的, 所以需要改成mdb的調(diào)試信息才可以.
- 之后就一切順利了, 斷點(diǎn), 單步跟蹤, 監(jiān)視器什么的都很完美:

C#腳本實(shí)踐(四): 反射與序列化
|