前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在webassembly中使用浏览器断点调试c/c++

在webassembly中使用浏览器断点调试c/c++

作者头像
腾讯VTeam技术团队
发布2021-04-12 10:10:35
4.1K1
发布2021-04-12 10:10:35
举报
文章被收录于专栏:VTeam技术团队VTeam技术团队

点击上方蓝字,发现更多精彩

导语

对于webassembly开发者来说,调试代码曾是一件比较痛苦的事情。好消息是,近期chrome canary已支持更高级的调试,本篇对调试方法进行一个实践。

对于webassembly开发者来说,调试代码曾是一件比较痛苦的事情。我们用一个例子来演示调试。一个简单的c文件

 index.c:

代码语言:javascript
复制
int main(int argc, char *argv[])  int a = 1;  printf("hello world, %d\n", a);  return 0;}

编译成webassembly

代码语言:javascript
复制
emcc index.c -o output.html

然后我们在浏览器打开dev-tools,你可以在wasm代码中断点,但是仅仅能看到如下的栈式调用,右侧的scope也无法看到真实的变量名。唯一可以看到的是调用栈。

另一种比较原始的方案是打log,你可能需要很多个printf才能找到问题。打log首先是无法追踪堆栈信息。另一个问题是,webassembly无法直接打印字符串日志信息到浏览器控制台。事实上,js和c代码只能传递数值类型。在js和c代码之间传递字符串是比较麻烦的。

当webassembly应用更大更复杂时,上面的调试方式就显得更加低效。

实际上,我们可以在emscripten的官方网站看到-g编译参数的说明:

也就是说,emscripten工具是可以导出DWARF格式的调试信息的,它包含了源代码的各种调试信息,包括变量名保留等。那么浏览器是完全可以利用DWARF数据进行友好调试的。好消息是,近期在最新chrome canary已支持在浏览器进行高级的调试c/c++代码了,不但可以断点调试,而且可以实时看到变量名称和变量值。下面我们进行一下实践:

1、显然的,我们需要在编译参数中增加-g参数,还有-fdebug-compilation-dir参数

代码语言:javascript
复制
emcc -g index.c -fdebug-compilation-dir='.' -o output.html

其中fdebug-compilation-dir参数指向c代码源码路径

2、更新chrome canary到最新版

3、打开chrome设置

4、打开设置 

5、安装DWARF插件

https://chrome.google.com/webstore/detail/cc -devtools-support-dwa/pdcpmagijalfljmkmjngeonclgbbannb

重新编译wasm文件,然后打开浏览器尝试一下:

是不是很舒服?左侧是我们的源码,鼠标移到a变量上,可以看到a变量的值,在右侧的scope面板可以看到局部变量。

试试指针的显示:

结构体:

甚至可以在控制台输出。不过控制台暂无法进行表达式运算。于此,我们可以在复杂的wasm应用中进行更便捷的调试。

END

更多精彩推荐,请关注我们

你的每个赞和在看,我都喜欢!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯VTeam技术团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档