gpt4 book ai didi

javascript - 查看传递给抛出异常的构造函数的字符串

转载 作者:行者123 更新时间:2023-11-28 05:58:28 24 4
gpt4 key购买 nike

我正在尝试调试使用 Emscripten 编译的 C++ 程序,该程序会抛出异常,特别是 runtime_error s 将字符串作为 what_arg 传递。但是,当它们抛出时,我只是在 Javascript 控制台中得到一个数字(指针值?)输出。传递给构造函数的字符串会更有帮助。

例如程序

#include <stdexcept>

int main()
{
throw std::runtime_error("I want to see this in the console");
return 0;
}

通过命令使用 Emscripten 1.35.0 64 位(在 Mac OS X 上)编译

em++ exception.cc -o exception.html

在浏览器中查看时,输出到控制台

Uncaught 5247024

我如何在运行时看到 what_arg 参数是什么?

理想情况下,C++ 代码中没有 try-catch block ,因此我可以使用 DISABLE_EXCEPTION_CATCHING旗帜。有多种方法可以使用 Pointer_stringify 将 C 风格字符串的内存地址转换为 Javascript 字符串。 .也许作为异常传递的数字有类似的东西?

最佳答案

有一种方法可以使用 window.onerror ,似乎在抛出未处理的异常时调用。使用这个,我可以

  • 获取onerror handler的第5个参数
  • 如果不是数字则什么也不做
  • 使用例如ccall 将数字传回C++ 世界的函数
  • 然后该函数对数字执行 reinterpret_cast 以获取指向 runtime_error 的指针>
  • runtime_error 上调用 what 并将结果字符串传递给 cerr

执行此操作的示例 C++ 程序是

#include <stdexcept>
#include <iostream>

#include <emscripten.h>

extern "C" void EMSCRIPTEN_KEEPALIVE what_to_stderr(intptr_t pointer)
{
auto error = reinterpret_cast<std::runtime_error *>(pointer);
std::cerr << error->what() << "\n";
}

int main()
{
throw std::runtime_error("I want to see this in the console");
return 0;
}

可以使用命令编译

em++ -std=c++11 exception.cc -o exception.js

并在一个简单的 HTML 页面中运行

<!doctype html>
<html>
<head>
<title>Exception test</title>
<script>
var Module = {};
window.onerror = function(message, url, line, column, e) {
if (typeof e != 'number') return;
var pointer = e;
Module.ccall('what_to_stderr', 'number', ['number'], [pointer]);
}
</script>
<script src="exception.js"></script>
</head>
<body>
</body>
</html>

它似乎适用于 Chrome 46 和 Firefox 41。

关于javascript - 查看传递给抛出异常的构造函数的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33721835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com