2015-11-15 2 views
0

Я пытаюсь отлаживать программу на C++, скомпилированную с помощью Emscripten, которая генерирует исключения, в частности 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 64bit (на Mac OS X) с помощью команды

em++ exception.cc -o exception.html 

, если смотреть в браузере, выходы на консоли

Uncaught 5247024 

Как я могу видеть во время выполнения то, что было аргументом what_arg?

В идеале это было бы без блока try-catch в коде C++, поэтому я мог бы использовать флаг DISABLE_EXCEPTION_CATCHING. Существуют способы преобразования адреса памяти строки C в строку Javascript с использованием Pointer_stringify. Может быть, что-то похожее на число, принятое за исключение?

+0

Я не вижу смысла трансформировать C++ в JS для выполнения браузера, но неважно. В любом случае вы поймали бы исключение в C++, например: 'try {...} catch (std :: exception ex) {std :: cout << ex.what(); } '. – szczurcio

+0

@szczurcio Можете ли вы пояснить, почему не было бы смысла видеть, что аргумент был? –

+0

Извините, пожалуйста, уточните, какой аргумент? Если вы запрашиваете сообщение 'const char []', которое вы передаете в конструктор 'std :: runtime_error', это то, что' what() 'даст вам. – szczurcio

ответ

0

Существует способ использования window.onerror, который, кажется, называется, когда есть необработанное исключение выброшены. Пользуясь этим, я могу

  • Получить 5-й параметр OnError обработчика
  • ничего не делать, если это не число
  • Пропустите число обратно в мир C++ для функции, используя, например, ccall
  • функция затем делает reinterpret_cast на номер, чтобы получить указатель на runtime_error
  • Зов what на runtime_error и передать полученную строку в 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.

1

Вам необходимо указать catch и напечатать строку what() вручную.

EDIT: Это имеет быть сделано в C++ с блоком try/catch, что-то вроде:

int main(int argc, char** argv) 
{ 
    try 
    { 
     throw std::runtime_error("I want to see this in the console"); 
    } 
    catch (const std::runtime_error& error) 
    { 
     std::cout << error.what() << std::endl; 
    } 

    return 0; 
} 
+0

Можете привести пример кода? Будет ли это ловить его на C++ или в Javascript? –

+0

Это будет ловить его на C++. Тогда вам нужно будет как-то отправить информацию в JS. –

 Смежные вопросы

  • Нет связанных вопросов^_^