在开发过程中,在生成C/C++代码之前,最好通过运行算法的MEX版本来测试生成的代码。但是,某些错误仅在目标硬件上发生。要检测这些错误,请生成独立的库和可执行文件,用于检测和报告运行时错误,例如越界数组索引。
默认情况下,对独立库和可执行文件禁用运行时错误检测。要为独立库和可执行文件启用运行时错误检测和报告,请执行以下操作:
在命令行中,使用代码配置属性RuntimeChecks
.
cfg = coder.config (“自由”);%或“dll”或“exe”cfg.RuntimeChecks=true;编码基因配置cfgmyfunction
在MATLAB®编码员™应用程序,在项目设置对话框中,在调试窗格中,选择生成运行时错误检查复选框。
运行时错误检测会影响生成代码的性能。如果您的应用程序考虑性能,则不要生成启用运行时错误检测的产品代码。
如果目标语言是C,则生成的代码使用流
将错误消息写入stderr
. 然后,代码使用中止
终止应用程序。如果流
和中止
不可用,您必须提供它们。的中止
函数突然终止程序。如果系统支持信号,则可以捕获中止信号(万博1manbetx西格布特
),以便控制程序的终止。
如果您的目标语言是c++,则生成的代码会抛出std:: runtime_error
运行时错误的异常。调用生成的c++入口点函数时,可以使用尝试
-接住
块在外部c++代码中。
然而,对于并行区域内的运行时错误检查(或parfor
循环或自动并行化为
循环),生成的C++代码不会抛出异常。在这种情况下,生成的代码使用流
将错误消息写入stderr
,然后使用中止
终止应用程序。要了解有关自动并行化的更多信息,请参阅自动并行生成代码中的循环.
在这个例子中,您比较了一个MATLAB®函数的C和c++代码的运行时行为,该函数计算其输入参数的平方根。生成的代码只能接受非负的实际值,并为负输入产生运行时错误:
生成的C代码使用流
将错误消息写入stderr
. 然后,代码使用中止
终止应用程序。
生成的C++代码抛出std:: runtime_error
此运行时错误的异常。在为调用生成的函数而编写的c++主函数中,可以使用尝试
-接住
块。
定义MATLAB函数
定义MATLAB函数errorCheckExample
在一个单独的文件中。这个函数计算其输入参数的平方根:
类型errorCheckExample
函数y=errorCheckExample(x)y=sqrt(x);结束
生成C库和可执行文件
为。生成一个动态链接的C库errorCheckExample
它接受双标量输入。控件使用代码配置对象RuntimeChecks
参数设置为符合事实的
。此外,请使用- d
将代码生成文件夹命名为的选项codegen_c_dll
.
cfg = coder.config (“dll”);cfg.RuntimeChecks=true;编码基因配置cfgerrorCheckExamplearg游戏1- dcodegan_c_动态链接库-报告
代码生成成功:要查看报告,打开('codegan_c_dll/html/report.mldatx')
打开代码生成报告并检查该文件errorCheckExample.c
.为MATLAB函数生成的C函数具有签名双errorCheckExample(双x染色体)
.为了计算平方根,errorCheckExample
调用sqrt
只计算实平方根的库函数。所以,errorCheckExample
只能接受积极的投入。消极的输入,errorCheckExample
调用生成的实用函数rtErrorWithMessageID
使用流
向…写入错误消息stderr
然后使用中止
终止应用程序。
静态无效rtErrorWithMessageID(const int b,const char*c,const char*aFcnName,int alineum){fprintf(stderr,“域错误”。若要从实x计算复杂结果,请使用“\'%.*s(complex(x))\'”,b,c);fprintf(stderr,“\n”);fprintf(stderr,“错误在%s(行%d)”,aFcnName,alineum);fprintf(stderr,“\n”);fflush(stderr);abort();}
生成库代码时,代码生成器还生成示例主文件main.h
和c
在例子
构建文件夹的子文件夹。支持的C万博1manbetx文件main_runtime_check.h
和main_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;编码基因配置cfgmain_runtime_check.cmain_runtime_check.herrorCheckExamplearg游戏1- oerrorCheckExample_c- dcodegen_c_exe
代码生成成功。
运行生成的可执行文件。观察它是否打印了在实用程序函数中硬编码的错误消息rtErrorWithMessageID
.
如果isunix系统(“./errorCheckExample_c”);elseifispc系统('errorCheckExample_c.exe');其他的disp(“平台不受支持”万博1manbetx);结束
域的错误。要计算实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;编码基因配置cfg-朗:c++errorCheckExamplearg游戏1- dcodegen_cpp_dll-报告
代码生成成功:要查看报告,打开('codegen_cpp_dll/html/report.mldatx')
打开代码生成报告并检查该文件errorCheckExample.cpp
. 与上一节中生成的C函数类似,errorCheckExample
只能接受积极的投入。消极的输入,errorCheckExample
调用实用程序函数rtErrorWithMessageID
.但在这种情况下,效用函数抛出std:runtime\u错误
例外,你可以捕捉和处理在你的手写主要的
函数。
static void rtErrorWithMessageID(const char *b, const char *aFcnName, int aLineNum) {std::stringstream outStream;输出流<< "域错误。要计算实x的复数结果,使用\'")<< b) << "(complex(x))\' ";outStream < <“\ n”;((((outStream < <“错误”)< < aFcnName) < <(行)< < aLineNum) < <“)”;把std:: runtime_error (outStream.str ());}
生成库代码时,代码生成器还生成示例主文件main.h
和c
在例子
构建文件夹的子文件夹。支持c+万博1manbetx+文件main_runtime_check.hpp
和main_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;编码基因配置cfg-朗:c++main_runtime_check.cppmain_runtime_check.hpperrorCheckExamplearg游戏1- oerrorCheckExample_cpp- dcodegen_cpp_exe
代码生成成功。
运行生成的可执行文件。请注意,它会打印修改后的错误消息。
如果isunix系统(”。/ errorCheckExample_cpp ');elseifispc系统('errorCheckExample_cpp.exe');其他的disp(“平台不受支持”万博1manbetx);结束
捕获异常:域错误。要计算实x的复数结果,使用“根号(复数(x))”。根号错误(第13行)
独立代码中的运行时错误检测和报告具有以下限制:
错误信息只有英文。
某些错误检查需要双精度支持。因此,运行生成代码的硬件必须支持双精度操作。万博1manbetx
如果程序终止,错误检测和报告软件不显示运行时堆栈。要检查堆栈,请附加一个调试器。
如果生成的C代码终止,错误检测和报告软件不会释放资源,比如已分配的内存。生成的c++代码没有这个限制。如果生成的c++代码终止,则释放分配的内存和其他资源。
在独立代码中,函数错误
显示提示发生错误的消息。以查看指定的实际消息错误
,则必须生成并运行一个MEX函数。
在独立代码中,如果使用多个参数调用,函数明确肯定
不报告错误,也不终止执行。例如,如果使用单个参数调用,断言(cond)
如果康德
这不是一个常数符合事实的
值,报告错误并终止执行。
codegen
|coder.CodeConfig
|编码器。EmbeddedCodeConfig