在线文档教程
Erlang 20

13.调试 | 13. Debugging

13 调试

13.1 工具和常见问题

第一次使用Orber的人可能会发现在尝试建立由另一个供应商或另一个Orber-ORB提供的Orber-ORB和ORB之间的通信时很难说出什么问题。本章的目的是告诉人们最常见的错误以及可以用来克服这些问题的工具。

工具

首先,Orber可以配置为以调试模式运行。有四种方法可以设置此参数:

  • erl -orber orber_debug_level 10 - 可以添加到启动脚本。

  • corba:orb_init({orber_debug_level,10}) - 必须启动Orber 之前调用此操作。

  • orber:configure(orber_debug_level,10) - 这个操作可以随时调用。

  • OrberWeb - 通过Configuration菜单可以轻松更改配置。有关更多信息,请参阅本用户指南中的OrberWeb章节。

当Orber运行我的调试模式时,如果发生任何异常(不一定是错误),将生成打印输出。一条错误消息通常如下所示:

=ERROR REPORT==== 29-Nov-2001::14:09:55 === =================== Orber ================= [410] corba:common_create(orber_test_server, [{pseudo,truce}] not a boolean(truce). ===========================================

在上面的例子中,我们试图创建一个不正确选项的对象(即应该是{pseudo,true})。

如果您无法解决问题,则应在联系支持人员或使用erlang问题邮件列表时包含所有生成的报告。

例如,很容易忘记设置结构中的所有字段,在使用Orber开发应用程序时哪个字段可能不会发现。当使用类型化语言时,这样的错误会导致编译时错误。为了避免这些错误,Orber允许用户激活所有本地CORBA对象调用的自动类型检查。为了使这个功能非常有用,用户必须创建尽可能覆盖的测试套件。例如,调用具有无效或不正确参数的操作也应该被测试。可以通过以下方式为一个对象或所有对象激活该选项:

  • 'MyModuyle_MyInterface':oe_create(Env,{local_typecheck,true}) - 这种方法只会激活或停用返回实例的类型检查。当然,这个选项也可以传递给oe_create_link/2corba:create/4corba:create_link/4

  • erl -orber标志2 - 可以添加到启动脚本中。所有的对象调用都将进行类型检查,除非被前一个选项覆盖。

  • corba:orb_init((flags,16#0002)) - 必须启动Orber 之前调用此操作。作为先前的选项行事。

如果传递或返回了不正确的数据,Orber将使用该error_logger来生成日志,如下所示:

=ERROR REPORT==== 10-Jul-2002::12:36:09 === ========= Orber Typecheck Request ========= Invoked......: MyModule_MyInterface:foo/1 Typecode.....: [{tk_enum,"IDL:MyModule/enumerant:1.0", "enumerant", ["one","two"]}] Arguments....: [three] Result.......: {'EXCEPTION',{'MARSHAL',[],102,'COMPLETED_NO'}} ===========================================

请注意,arity等同于IDL文件。 在上面的例子中,使用了一个未定义的枚举。 在大多数情况下,设置配置参数orber_debug_level 10也很有用。 由于额外的开销,这个选项只能在测试和开发过程中使用。 有关更多信息,另请参阅配置设置。

也可以跟踪Orber-ORB和例如Java-ORB之间的所有通信,通过IIOP进行通信。 你所需要做的就是激活一个拦截器。 通常,用户必须自己实施拦截器,但为了您的方便,Orber包含三个预编译的拦截器,分别称为orber_iiop_tracer,orber_iiop_tracer_silent和orber_iiop_tracer_stealth。

警告

记录所有流量是昂贵的。因此,在测试和开发过程中只能使用提供的拦截器。

orber_iiop_tracerorber_iiop_tracer_silent拦截使用该error_logger模块生成的日志。如果流量激烈,您可能希望将报告写入日志文件。这是通过例如调用:

erl> error_logger:tty(false). erl> error_logger:logfile{open, "/tmp/IIOPTrace"}).

IIOPTrace如果使用orber_iiop_tracer拦截器,该文件将包含如下报告:

=INFO REPORT==== 13-Jul-2005::18:22:39 === =============== new_out_connection ======= Node : myNode@myHost From : 192.0.0.10:47987 To : 192.0.0.20:4001 ========================================== =INFO REPORT==== 29-Nov-2001::15:26:28 === =============== out_request ============== Connection: {"192.0.0.20",4001,"192.0.0.10",47987} Operation : resolve Parameters: [[{'CosNaming_NameComponent', "AIK","SwedishIcehockeyChampions"}]] Context : [{'IOP_ServiceContext',1, {'CONV_FRAME_CodeSetContext',65537,65801}}] ==========================================

orber_iiop_tracer_silent不会记录GIOP编码数据。要激活一个拦截器,你有两个选择:

  • erl -orber拦截器“{native,orber_iiop_tracer}” - 可以添加到启动脚本中。

  • corba:orb_init([{interceptors,{native,orber_iiop_tracer_silent}}]) - 必须启动Orber 之前调用此操作。

也可以在运行时激活和停用拦截器,但这只会影响当前现有的连接。有关更多信息,请参阅Orber的参考手册,了解有关操作orber:activate_audit_trail/0/1orber:activate_audit_trail/0/1.

常问问题

问:当我的客户端(通常用C ++或Java编写)在Orber对象引用上调用narrow时失败?

答:您必须通过调用在IFR中注册您的应用程序oe_register()。如果对象是由COS应用程序创建的,则必须运行install(例如cosEventApp:install())。

答:通过查阅IDL规范,确认收到的对象引用确实从您试图缩小的接口继承。

问:我正试图在IFR中注册我的应用程序,但它失败了。为什么?

答:如果您的IDL规范中的一个或多个接口继承自其他接口,则必须在注册应用程序之前注册它们。请注意,当您继承由COS应用程序支持的接口时,这也适用。因此,他们必须在申请注册之前安装。

问:我有一个Orber客户端和服务器驻留在两个不同的Orber实例上,但我只能得到'OBJECT_NOT_EXIST'异常,即使我确定该对象仍然存在?

答:如果两个Orber-ORB不打算成为多节点ORB的一部分,请确保两个Orber-ORB具有不同的域名集(请参阅参考资料configuration settings)。确认这一点的最简单方法是orber:info()在每个节点上调用。

问:当我试图安装和/或启动Orber时,它会失败吗?

答:确保没有其他Orber-ORB已经在同一个节点上运行。如果是这样,请更改iiop_port配置参数(请参阅configuration settings)。

问:我的Orber服务器是通过IIOP调用的,但Orber无法封送答复?

答:请咨询您的IDL文件以确认您的回复是正确的类型。如果它是正确的,并且返回类型是,例如,一个结构,请确保您已设置结构中的每个字段。如果你不这样做,它将被设置为原子'未定义',这肯定是不正确的。

答:请检查您是否正确处理inoutout参数(请参阅IDL规范)。例如,一个函数有一个out参数并且应该返回void,那么你的回调模块应该返回{reply, {ok, OutParam}, State}。请注意,即使返回值为空(IDL),您也必须回复正常。

问:我不能将Orber作为多节点ORB运行?

答:确保每个节点的Erlang分布已经启动,并且cookies都是正确的。有关更多信息,请参阅System Documentation