【问题标题】:Process crash after Informix errorInformix 错误后进程崩溃
【发布时间】:2012-06-16 01:23:07
【问题描述】:

我有一个 C++ 进程不时崩溃(主要是在完成性能测试时)。 当我检查核心日志时,我可以在崩溃之前看到很多 Informix 错误。

在进程核心转储之前,我看到一系列错误代码为 406 的 Informix 错误,这与 Out of Memory 异常有关。 我还看到错误代码 244(无法进行物理顺序读取以获取下一行)。

有人可以分享您对这些场景如何导致进程核心转储的想法吗?

更多详情

进程:多线程 C++ 进程
环境:Solaris
数据库:带有 ESQL 接口的 Informix

ESQL DB 函数(插入/更新/选择)正在抛出,被进程捕获。 catch 块中的消息是进程日志中出现的最后一条消息。之后就没有关于这个过程的线索了。

进程核心转储时出现的正常消息(Caught signal. dumped core)也丢失了。

【问题讨论】:

  • 核心转储是您的 C++ 程序还是 Informix 服务器?您使用的是线程 C++ 程序吗?你在使用线程库吗?您正在使用哪个接口(ODBC、ESQL/C、OLEDB、...)?程序在哪个平台上运行?数据库服务器?您使用的是哪些版本?您的应用程序如何处理错误报告?在线日志文件有什么要说的?等等。有无数的问题可能是麻烦。但是,服务器不应该崩溃。它可以做各种各样的事情,但崩溃不是其中之一。
  • @JonathanLeffler - 这是一个多线程 C++ 进程。它使用 ESQL 接口。进程正在 Solaris 上运行。该过程在没有任何线索的情况下崩溃。我在进程日志中看到的最后一个日志是一系列 Informix 错误。即使是说进程已转储核心的日志也丢失了。 pstack 也没有提供正确的信息。
  • 您是否正在链接线程安全(r) ESQL/C 库?这是 Solaris;是 8、9、10 还是 11?哪个版本的 ESQL/C?您是否正确共享线程之间的连接?您知道 SET CONNECTION 'conn_name' DORMANT 吗?您是在建立线程之前还是之后建立连接?与数据库通信的每个线程是否都有自己的连接? (我对您的 cmets 的印象是崩溃的是您的 C++ 程序,而不是 Informix 数据服务器;对吗?)
  • 是的,是进程崩溃了。我所说的是informix错误(406-Out of memory exception)不断出现。我觉得内存耗尽并且由于内存不足而导致进程崩溃。这会发生吗?
  • 哪个版本的 Informix 服务器?.. Informix ol 日志文件说什么?.. onconfig 参数是什么?

标签: c++ informix coredump


【解决方案1】:

当你说during performance testing 时,你有一个巨大的线索!!!!!

对于性能测试用例,通常会加速编译器优化,从而导致一些写得不好的代码短路,从而导致崩溃。

给你一个典型的例子:当变量应该被跨线程读取时,它们没有被声明为 volatile。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多