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编译器里生成了不正确的信息,要改正必然要花很大功夫,只能另辟巧径:

  1. 修改pony编译器,开启CodeView和去掉strip_debug

    pm->addModuleFlag(Module::Warning, "CodeView", 1);
  2. 编译pony程序时,输出LLVM ir

    ponyc . -d -r=ir
  3. 用clang生成目标文件:

    clang -c main.ll
  4. 用link进行链接

    link /DEBUG advapi32.lib ws2_32.lib libponyrt.lib crypto.lib main.o

link/DEBUG选型可以生成调试信息,然后就能用Visual Studio Debugger来调试了:

VS Code 调试效果

基本的断点、步进、查看变量都没问题,甚至能步进到pony的标准库和运行时。

但是还有些问题:

  1. 复杂的对象,缺少类型信息,就很难看出有用的信息,如果有Natvis就更加实用了

  2. 复杂的控制流程步进很很混乱,match、is语句支持不好

  3. actor的behavior是异步调用,不能直接步进

在github发了issue:Enable Windows debugging


oraoto
5.4k 声望1.2k 粉丝

墙上芦苇,头重脚轻根底浅;


引用和评论

0 条评论