主要内容

生成独立的C / c++代码检测和报告运行时错误

在开发期间,在您生成C / c++代码之前,这是一个最佳实践测试生成的代码的墨西哥人版本运行算法。然而,一些只在目标硬件错误发生。检测这些错误,生成独立的库和可执行文件,检测和报告运行时错误,如禁止入内的索引数组。

默认情况下,运行时错误检测为独立的库和可执行文件是禁用的。启用运行时错误检测和报告为独立的库和可执行文件:

  • 在命令行中,使用代码配置属性RuntimeChecks

    cfg = coder.config (“自由”);%或“dll”或“exe”cfg。RuntimeChecks = true;codegen配置cfgmyfunction
  • MATLAB®编码器™应用程序,在“项目设置”对话框中调试窗格中,选择生成运行时错误检查复选框。

运行时错误检测会影响生成的代码的性能。如果性能是一个考虑您的应用程序,不生成生产代码启用运行时错误检测。

生成C代码与生成c++代码

如果你的目标语言是C,生成的代码使用写错误消息stderr。然后,代码使用中止终止应用程序。如果中止不可用,您必须提供它们。的中止突然终止程序的函数。如果你的系统支持的信号,你可以金宝app赶上中止信号(SIGABRT),这样你可以控制程序终止。

如果你的目标语言c++,生成的代码抛出std:: runtime_error运行时错误的异常。当你调用c++生成的入口点函数,你可以通过使用一个捕获和处理这些异常试一试- - - - - -在你的外部c++代码块。

然而,对于并行区域(无论是内部运行时错误检查parfor循环或自动并行化循环),生成c++代码不会抛出异常。在这种情况下,生成的代码使用写错误消息stderr,然后使用中止终止应用程序。想要了解更多关于自动并行化,明白了自动并行化的循环生成的代码

例子:比较生成的C和c++代码,包括运行时检查

在本例中,您比较运行时行为生成的C和c++代码的MATLAB®函数计算平方根的输入参数。生成的代码只能接受负的实际值和负输入产生一个运行时错误:

  • 生成的C代码使用写的错误消息stderr。然后,代码使用中止终止应用程序。

  • 生成c++代码会抛出一个std:: runtime_error异常运行时错误。在c++主要功能编写调用生成的函数,你发现并处理这个异常使用试一试- - - - - -块。

定义MATLAB函数

定义MATLAB函数errorCheckExample在一个单独的文件。这个函数计算平方根的输入参数:

类型errorCheckExample
函数y = errorCheckExample (x y =√(x);结束

生成C库和可执行文件

生成动态链接C库errorCheckExample接受双标量输入。使用一个代码配置对象RuntimeChecks参数设置为真正的。同时,使用- d选项名称代码生成的文件夹codegen_c_dll

cfg = coder.config (“dll”);cfg。RuntimeChecks = true;codegen配置cfgerrorCheckExamplearg游戏1- dcodegan_c_dll报告
代码生成成功:查看报告,打开(“codegan_c_dll / html / report.mldatx”)

打开代码生成报告和检查文件errorCheckExample.c。为你的MATLAB函数生成的C函数签名双errorCheckExample(双x染色体)。计算平方根,errorCheckExample调用√6库函数计算唯一真正的根。所以,errorCheckExample只能接受积极的投入。消极的输入,errorCheckExample调用生成的效用函数rtErrorWithMessageID使用写一个错误消息stderr然后使用中止终止应用程序。

静态孔隙rtErrorWithMessageID (const int b, const char * c, const char * aFcnName, int aLineNum){流(stderr,”域错误。计算复杂的结果从真正的x,使用“\ ' %。*年代(复杂的(x)) \。”,b, c);流(stderr,“\ n”);流(stderr,“错误% s (% d行)”、aFcnName aLineNum);流(stderr,“\ n”);。fflush (stderr);abort ();}

当生成库代码,代码生成器也生产主要文件示例main.hc例子建立文件夹的子文件夹。支持C文金宝app件main_runtime_check.hmain_runtime_check.c这些示例文件的修改版本。修改后的主要函数调用errorCheckExample (4)产生一个运行时错误。

C运行这些命令来生成一个可执行使用修改后的主要文件。代码生成的文件夹名称codegen_c_exe。可执行文件的名字errorCheckExample_c通过使用- o选择与codegen命令。

cfg = coder.config (exe”);cfg。RuntimeChecks = true;cfg。CustomSource =“main_runtime_check.c”;cfg。CustomInclude = pwd;codegen配置cfgmain_runtime_check.cmain_runtime_check.herrorCheckExamplearg游戏1- oerrorCheckExample_c- dcodegen_c_exe
代码生成成功。

运行生成的可执行文件。观察到它打印错误消息中硬编码的效用函数rtErrorWithMessageID

如果isunix系统(”。/ errorCheckExample_c ');elseifispc系统(“errorCheckExample_c.exe”);其他的disp (平台不支持的金宝app);结束
域的错误。计算复杂的结果从真正的x,使用“sqrt(复杂的(x))”。错误返回值(13号线)/ errorCheckExample_c:中止

生成c++库和可执行文件

生成c++动态链接库errorCheckExample接受一个标量双输入。使用一个代码配置对象RuntimeChecks参数设置为真正的。同时,使用- d选项名称代码生成的文件夹codegen_cpp_dll

cfg = coder.config (“dll”);cfg。RuntimeChecks = true;codegen配置cfg朗:c++errorCheckExamplearg游戏1- dcodegen_cpp_dll报告
代码生成成功:查看报告,打开(“codegen_cpp_dll / html / report.mldatx”)

打开代码生成报告和检查文件errorCheckExample.cpp。类似于C函数生成在前一节中,errorCheckExample只能接受积极的投入。消极的输入,errorCheckExample所谓的效用函数rtErrorWithMessageID。但在这种情况下,效用函数抛出std: runtime_error异常,您可以捕获和处理你的手写主要函数。

静态孔隙rtErrorWithMessageID (const char * b, const char * aFcnName, int aLineNum) {std:: stringstream outStream;((outStream < <“域错误。计算复杂的结果从真正的x,使用\”)< < b) < <”(复杂的(x)) \’。”;outStream < <“\ n”;((((outStream < <“错误”)< < aFcnName) < <(行)< < aLineNum) < <“)”;把std:: runtime_error (outStream.str ());}

当生成库代码,代码生成器也生产主要文件示例main.hc例子建立文件夹的子文件夹。支持c+金宝app+文件main_runtime_check.hppmain_runtime_check.cpp这些示例文件的修改版本。修改后的main ()函数调用errorCheckExample (4)在一个try - catch块。块捕获异常并打印修改后的信息通过将字符串“抓到excaption:“捕获异常的消息。

运行这些命令来生成一个c++执行使用修改后的主要文件。代码生成的文件夹名称codegen_cpp_exe。可执行文件的名字errorCheckExample_cpp

cfg = coder.config (exe”);cfg。RuntimeChecks = true;cfg。CustomSource =“main_runtime_check.cpp”;cfg。CustomInclude = pwd;codegen配置cfg朗:c++main_runtime_check.cppmain_runtime_check.hpperrorCheckExamplearg游戏1- oerrorCheckExample_cpp- dcodegen_cpp_exe
代码生成成功。

运行生成的可执行文件。观察到它打印修改后的错误消息。

如果isunix系统(”。/ errorCheckExample_cpp ');elseifispc系统(“errorCheckExample_cpp.exe”);其他的disp (平台不支持的金宝app);结束
发现例外:域错误。计算复杂的结果从真正的x,使用“sqrt(复杂的(x))”。错误返回值(13号线)

限制

在独立的代码运行时错误检测和报告这些限制:

  • 错误信息仅在英语。

  • 一些错误检查需要双精度的支持。金宝app因此,生成的代码运行的硬件必须支持双精度运算。金宝app

  • 如果程序终止,错误检测和报告软件不显示运行时堆栈。检查堆栈,附加一个调试器。

  • 如果生成的C代码终止,错误检测和报告软件不释放资源,如分配的内存。生成c++代码没有这个限制。如果生成c++代码终止,分配的内存和其他资源被释放。

  • 在独立的代码,功能错误显示一条消息,表明发生了错误。指定的实际消息错误,您必须生成并运行一个墨西哥人的功能。

  • 在独立的代码中,如果使用多个参数,函数断言不报告错误和不终止执行。例如,如果使用一个参数断言(电导率),如果气孔导度不是一个常数真正的价值,报告错误和终止执行。

另请参阅

||

相关的话题