主要内容

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

在开发期间,在生成C/ c++代码之前,最好通过运行算法的MEX版本来测试生成的代码。然而,有些错误只发生在目标硬件上。为了检测这些错误,生成检测和报告运行时错误的独立库和可执行程序,例如超出边界的数组索引。

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

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

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

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

生成C代码vs.生成c++代码

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

如果您的目标语言是c++,则生成的代码会抛出std:: runtime_error运行时错误的异常。调用生成的c++入口点函数时,可以使用试一试-块在外部c++代码中。

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

限制

独立代码中的运行时错误检测和报告有以下限制:

  • 错误消息只有英文。

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

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

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

  • 在独立代码中,函数错误显示一条消息,指示发生错误。查看由此指定的实际消息错误,则必须生成并运行一个MEX函数。

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

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

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

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

  • 生成的c++代码抛出std:: runtime_error此运行时错误的异常。在为调用生成的函数而编写的c++主函数中,可以使用试一试-块。

定义MATLAB函数

定义MATLAB函数errorcheckexample.在一个单独的文件中。此函数计算其输入参数的平方根:

类型errorcheckexample.
function y = errorCheckExample(x) y =√(x);结束

生成C库和可执行文件

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

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

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

static void rtErrorWithMessageID(const int b, const char *c, const char *aFcnName, int aLineNum) {fprintf(stderr, "域错误。要计算实x的复数结果,使用" "\'%.*s(complex(x))\'.", b, c);流(stderr,“\ n”);fprintf(stderr, "Error in %s (line %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.herrorcheckexample.arg游戏1- oerrorCheckExample_c- dcodegen_c_exe
代码生成成功。

运行生成的可执行文件。可以看到,它打印了在实用程序函数中硬编码的错误消息rtErrorWithMessageID

如果isunix系统(”。/ errorCheckExample_c ');elseifispc系统(“errorCheckExample_c.exe”);其他的disp (“不支持平台”金宝app);结束
域的错误。要计算实x的复数结果,使用“根号(复数(x))”。/errorCheckExample_c: Aborted . Error in sqrt (line 13) ./errorCheckExample_c: Aborted

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

生成一个动态链接的c++库errorcheckexample.它接受标量双精度输入。控件使用代码配置对象runtimechecks.参数设置为真正的.同时,使用- d选项将代码生成文件夹命名为codegen_cpp_dll

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

打开代码生成报告并检查该文件errorCheckExample.cpp.与上一节中生成的C函数类似,errorcheckexample.只能接受积极的投入。消极的输入,errorcheckexample.调用实用函数rtErrorWithMessageID.但在这种情况下,效用函数抛出std: runtime_error例外,你可以捕捉和处理在你的手写主要函数。

静态void rterrorwitherageId(const char * b,const char * afcname,int alinenum){std :: stringstream外出;((Outstream <<“域错误。要计算Real X的复杂结果,请使用”)<< b)<<“(复杂(x))\'。”;外出<<“\ n”;((((Outstream <<“错误”)<< afcname)<<“(行”)<< alinenum)<<“)”;抛出std :: runtime_error(Outstream.str());}

在生成库代码时,代码生成器还会生成示例主文件main.hc例子构建文件夹的子文件夹。支持c+金宝app+文件main_runtime_check.hppmain_runtime_check.cpp是这些示例文件的修改版本。修改后的主要的()函数调用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.hpperrorcheckexample.arg游戏1- oerrorCheckExample_cpp- dcodegen_cpp_exe
代码生成成功。

运行生成的可执行文件。注意,它会打印修改后的错误消息。

如果isunix系统(”。/ errorCheckExample_cpp ');elseifispc系统(“errorCheckExample_cpp.exe”);其他的disp (“不支持平台”金宝app);结束
捕获异常:域错误。要计算实x的复数结果,使用“根号(复数(x))”。根号错误(第13行)

另请参阅

||

相关话题