【发布时间】: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 参数是什么?