pony在3年以前去掉了windows下调试信息生成,非常暴力:
#if defined(PLATFORM_IS_WINDOWS)
opt.strip_debug = true;
#endif
也就是固定去除调试信息选型。
但是我有主要使用Windows进行开发,这就很不方便了,于是尝试把这个选项去掉,然后加上CodeView信息生成(一共就改两行代码)。
再编译发现LLVM会出错:
Assertion failed: !isa<DIType>(Scope) && "shouldn't make a namespace scope for a type"
这错误说明在pony编译器里生成了不正确的信息,要改正必然要花很大功夫,只能另辟巧径:
-
修改pony编译器,开启CodeView和去掉strip_debug
pm->addModuleFlag(Module::Warning, "CodeView", 1);
-
编译pony程序时,输出LLVM ir
ponyc . -d -r=ir
-
用clang生成目标文件:
clang -c main.ll
-
用link进行链接
link /DEBUG advapi32.lib ws2_32.lib libponyrt.lib crypto.lib main.o
link
的/DEBUG
选型可以生成调试信息,然后就能用Visual Studio Debugger来调试了:
基本的断点、步进、查看变量都没问题,甚至能步进到pony的标准库和运行时。
但是还有些问题:
复杂的对象,缺少类型信息,就很难看出有用的信息,如果有Natvis就更加实用了
复杂的控制流程步进很很混乱,match、is语句支持不好
actor的behavior是异步调用,不能直接步进
在github发了issue:Enable Windows debugging。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。