腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
圈层
工具
MCP广场
文章/答案/技术大牛
搜索
搜索
关闭
发布
C#脚本实践
共 8 篇文章
加入清单架
1
C#脚本实践(四): 反射与序列化
2
C#脚本实践(三): 集成到游戏
3
C#脚本实践(三): 集成到游戏
4
C#脚本实践(四): 反射与序列化
5
C#脚本实践(五): 调试器
6
C#脚本实践(六): 脚本相对于C++的优势
7
C#脚本实践(一)
8
C#脚本实践(二): Unity脚本机制分析
清单首页
C#脚本实践
文章详情
清单「C#脚本实践」 05/08
C#脚本实践(五): 调试器
逍遥剑客
以前用过lua, 调试时很痛苦. 当然现在已经有比较成熟的调试器了, 比如decoda
在没有调试器之前都是怎么调试的呢?
printf打印到控制台之类的输出窗口. 如果做了热更新的话可以边改边看
输入命令, 让控制台显示结果. 对于C++来说控制台是个很不爽的东西, 因为每个指令都要写个解析函数. 而脚本则可以直接把脚本语句当指令敲进去, 比如
CsharpRepl
当然, 最理想的情况还是能够下断点, 单步跟踪
Unity使用MonoDevelop作为调试器, 幸运的是, MonoDevelop和UnityDebugger插件都是开源的, 所以很容易山寨过来
MonoDevelop有两种方式启动调试:
直接执行, 就像VS里按F5一样.
挂接到进程, 就是先启动程序, 然后把调试器挂上去. 这种对于脚本来说比较实用, 因为可以修改一下继续调试, 不用重新启动游戏
Mono调试时是有个调试服务器的, 可以通过socket连接客户端与服务器. 如果从MD里启动, 则MD是调试服务器. 如果是Attach方式, 则游戏是那个server.
以Attach方式为例:
int
port = (
int
)(56000 + (GetCurrentProcessId() % 1000));
char
options255;
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插件, 当然它只认"unity"开头的进程:
另外需要注意的是, 调试的DLL必须有mdb文件, 相当于pdb文件. MD默认是生成pdb文件的, 所以需要改成mdb的调试信息才可以.
之后就一切顺利了, 断点, 单步跟踪, 监视器什么的都很完美:
C#脚本实践(四): 反射与序列化
下一篇
举报
领券