生成独立的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.h
和c
在例子
建立文件夹的子文件夹。支持C文金宝app件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;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.h
和c
在例子
建立文件夹的子文件夹。支持c+金宝app+文件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;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++代码终止,分配的内存和其他资源被释放。
在独立的代码,功能
错误
显示一条消息,表明发生了错误。指定的实际消息错误
,您必须生成并运行一个墨西哥人的功能。在独立的代码中,如果使用多个参数,函数
断言
不报告错误和不终止执行。例如,如果使用一个参数断言(电导率)
,如果气孔导度
不是一个常数真正的
价值,报告错误和终止执行。
另请参阅
codegen
|coder.CodeConfig
|coder.EmbeddedCodeConfig