【问题标题】:exception in C codeC代码中的异常
【发布时间】:2011-08-24 19:44:14
【问题描述】:

想知道这个异常是关于什么的?

NTUnhandledExceptionHandler@NTExceptionHandler@@CGJPAU_EXCEPTION_POINTERS@@@Z! jdenet_k.exe?

=====Call stack of thread 5612=====
_LogNTCallStackDump@8! jdel.dll  
?NTUnhandledExceptionHandler@NTExceptionHandler@@CGJPAU_EXCEPTION_POINTERS@@@Z! jdenet_k.exe  
0x78c65b6.<nosymbols>! qstatus.dll  
0x771bd29e.<nosymbols>! ntdll.dll  
0x771bd45f.<nosymbols>! ntdll.dll  

====> Exception C0000005 ACCESS_VIOLATION occurred in thread 5612 with call stack:
_jdeStrcmp@8! jdeunicode.dll  
_IB4210030_SetCrossReferenceItemData@20! CSALES.dll  
_IB4210030_ReconcileSalesOrderLineData@24! CSALES.dll  
_IB4210030_IProcessSalesOrderLine@20! CSALES.dll  
_IB4210030_ProcessNextUnprocessedSalesOrderLine@20! CSALES.dll  
_ProcessNextUnprocessedSalesOrderLine@20! CSALES.dll  
_IB4210900_ProcessUnprocessedLines@12! CSALES.dll  
_IB4210900_PerformSalesOrderAction@32! CSALES.dll  
_SalesOrderApplCtrlEX@12! CSALES.dll  
_jdeCallObjectV2@44! jdekrnl.dll



There is also another related error in one of the log files:

====> Exception C0000005 ACCESS_VIOLATION occurred in thread 5612
call stack dumped in file <E:\JDEdwards\E812\DDP\log\jde_11740_1310990285_1_dmp.log>: iParam: 0000000000
INFO: Entering kernel signal handler, process exiting soon: iParam: 1310990289
INFO: Done setting IPC Handle State structures to abandoned, process exiting immediately: iParam: 1310990289

【问题讨论】:

  • 我会猜测“程序中的一个错误......某处”。
  • 你有一个access violation,可能是因为你传递了一个无效的指针到jdeStrcmp()。也许如果你发布了一些代码,不是通灵者的人可以弄清楚。
  • 问:问题解决了吗?您能否修改 CSALES.DLL 中的 SetCrossReferenceItemData() 函数,或者您是否已联系供应商进行补丁更新?

标签: c callstack


【解决方案1】:

强调文本看起来好像jdeunicode.dll 中的函数jdeStrcmp()stdcall 函数)导致了异常(访问冲突,换句话说,某个指针错误或为零) .

在我看来,一个好的 DLL 不会让异常逃逸,但显然这个例外。

更新

对于使用与 DLL 相同语言编写的调用者来说,让异常转义通常是没有问题的。对于不是的来电者来说,这可能是灾难性的。我从这里的经验说。该函数当然应该以某种方式通知调用者发生了什么事。如何发生是设计问题。让异常逃脱肯定是错误的方式。

参见this SO question,关于跨模块边界的异常。或this one(相同的语言,不同的版本!)。或谷歌它。您将看到许多原因和示例说明为什么跨模块边界的异常是一个坏主意(tm)

无法捕获逃避(本机)DLL 的异常的语言的一个示例是 C#,例如在this SO question。我假设这同样适用于其他 .NET 语言,以及一些本地语言。

【讨论】:

  • 如果Strcmp() 函数的指针错误或指针指向的数据已损坏,该怎么办?
  • @Rudy:我强烈反对“一个好的 DLL 不会让异常逃逸”。您是否希望您加载的每个 DLL 中的每个函数都用 __try/__except 块包围函数调用?如果有人将一个指针传入堆栈的保护页,你希望做什么?这通常会导致操作系统拦截、增加堆栈大小并重新启动的异常,但现在如果你正在吞下异常,代码会突然以神秘的方式失败。
  • @paulsm4:对不起,但不,我不认为我错了。我认为一个好的 DLL 不会让异常逃逸。良好的语言将能够处理仍然可以使用的 DLL,但这并不能消除我所说的。你可能不这么认为,但这并没有让我错。我还说函数应该优雅地结束,除其他外,这意味着它应该有一种方法来发出错误信号,例如一个特殊的返回值,或者类似 GetLastError() 的东西。这是设计问题。
  • @paulsm4:FWIW,让异常逃逸是 糟糕 设计的问题,并且很可能使调用者崩溃,例如如果该调用者不是用与 DLL 相同的语言或语言版本编写的。这肯定不会让调用者有机会优雅地恢复。
  • 哇 - 搅动了一些东西......(顺便说一句,我 +1 是因为我认为核心答案很好)。请注意,就“转义”DLL 的“异常”而言,请注意,无效访问并不是真正的 C++ 异常(尽管编译器可以使其成为异常)。传递它并不是真正的语言问题 - 这是一个平台问题(我不会与 Delphi 交谈;我对此一无所知)。有关堆栈保护页面的信息(它是 Windows 上的“堆栈自动扩展”机制)以及您应该如何处理无效指针(“您应该崩溃”),请参阅 blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx
【解决方案2】:

很明显,您有一些“JD Edwards”应用程序,它使用 .dll 的 jdeunicode.dll 和 jdekrnl.dll。故障位于 jdeunicode.dll 中的函数“JdeStrcmp()”中。

JdeStrcmp() 之一:

a) 有一个错误

 ... or ...

b) 未能检测到 null 或非法参数

建议:

  • 如果您的应用程序直接使用 JdeStrcmp(),请确保在比较两个字符串时检查 null 或非法字符串参数。为 8 位 ASCII 和 16 位 Unicode 字符串的不同组合编写测试用例会很有用。

  • 如果您购买了此 J.D. Edwards 应用程序和/或开发库,请联系他们的技术支持。也许他们有你可以安装的更新。

【讨论】:

  • INFO: 进入内核信号处理程序,进程即将退出:iParam: 1310990289
  • 感谢您的意见。我不能共享代码,因为它是受版权保护的应用程序代码。
  • @user624128 - 如果调用 JdeStrcmp() 的代码是您的代码,则修复它。在调用它之前检查传递给这个“Unicode-aware, J.D. Edwards String Compare”函数的参数。否则,请联系供应商并让他们修复它。
  • PS:如果有人是这里的罪魁祸首,那就是“CSALES.dll”中的“_SetCrossReferenceItemData()”。他就是用虚假参数调用 JdeStcmp() 的人。
猜你喜欢
  • 2014-06-08
  • 2011-05-08
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
  • 2010-10-28
相关资源
最近更新 更多