0

由于 RED hat Linux 上的分段错误,我们正面临 C++ 应用程序崩溃问题。我们在 C++ 中使用嵌入式 python。

请在下面找到我的限制

  1. 我不能访问应用程序崩溃的生产机器吗?当应用程序崩溃时,客户端向我们发送核心转储文件。
  2. 问题在我们的测试机器上无法重现,它与生产机器具有完全相同的配置。
  3. 有时应用程序在 1 小时、4 小时 ....1 天或 1 周后崩溃。我们还没有得到应用程序崩溃的时间框架或任何特定模式。
  4. 应用程序很复杂,并且在应用程序中的很多地方都使用了嵌入式 python 代码。我们进行了广泛的代码审查,但无法通过代码审查找到解决方法。
  5. 根据核心转储中的堆栈跟踪,它在乘法操作周围崩溃,在代码中审查了此类操作的代码,我们没有得到任何执行此类操作的代码。可能是此类操作是通过从我们无法控制或无法查看的嵌入式 python 执行的 python 脚本调用的。
  6. 我们不能在 Valgrind 等生产环境中使用任何分析工具。
  7. 我们在本地机器上使用 gdb 来分析核心转储。我们无法在生产机器上运行 gdb。

请在下面找到我们所做的努力。

  1. 我们已经分析了日志并不断地向我们的测试环境中的应用程序发出请求以重现问题。
  2. 我们没有在日志中得到崩溃点。每次我们得到不同的日志。我认为这是由于;内存在其他地方被破坏,应用程序在一段时间后崩溃。
  3. 我们已经在我们的应用程序的任何时候检查了负载,并且它从未超过我们的应用程序限制。
  4. 我们的应用程序的内存利用率也很正常。
  5. 我们在测试机器中借助 Valgrind 分析了我们的应用程序并删除了 valgrind 错误,但应用程序仍然崩溃。

我感谢任何帮助指导我们进一步解决问题。

以下是版本详情

红帽 linux 服务器 5.6 (Tikanga) Python 2.6.2 GCC 4.1

以下是我从他们共享的核心转储文件中获得的堆栈跟踪(在我的机器上)。仅供参考,我们无权访问生产机器来在核心转储文件上运行 gdb。

0  0x00000033c6678630 in ?? ()
1  0x00002b59d0e9501e in PyString_FromFormatV (format=0x2b59d0f2ab00 "can't multiply sequence by non-int of type '%.200s'", vargs=0x46421f20) at Objects/stringobject.c:291
2  0x00002b59d0ef1620 in PyErr_Format (exception=0x2b59d1170bc0, format=<value optimized out>) at Python/errors.c:548
3  0x00002b59d0e4bf1c in PyNumber_Multiply (v=0x2aaaac080600, w=0x2b59d116a550) at Objects/abstract.c:1192
4  0x00002b59d0ede326 in PyEval_EvalFrameEx (f=0x732b670, throwflag=<value optimized out>) at Python/ceval.c:1119
5  0x00002b59d0ee2493 in call_function (f=0x7269330, throwflag=<value optimized out>) at Python/ceval.c:3794
6  PyEval_EvalFrameEx (f=0x7269330, throwflag=<value optimized out>) at Python/ceval.c:2389
7  0x00002b59d0ee2493 in call_function (f=0x70983f0, throwflag=<value optimized out>) at Python/ceval.c:3794
8  PyEval_EvalFrameEx (f=0x70983f0, throwflag=<value optimized out>) at Python/ceval.c:2389
9  0x00002b59d0ee2493 in call_function (f=0x6f1b500, throwflag=<value optimized out>) at Python/ceval.c:3794
10 PyEval_EvalFrameEx (f=0x6f1b500, throwflag=<value optimized out>) at Python/ceval.c:2389
11 0x00002b59d0ee2493 in call_function (f=0x2aaab09d52e0, throwflag=<value optimized out>) at Python/ceval.c:3794
12 PyEval_EvalFrameEx (f=0x2aaab09d52e0, throwflag=<value optimized out>) at Python/ceval.c:2389
13 0x00002b59d0ee2d9f in ?? () at Python/ceval.c:2968 from /usr/local/lib/libpython2.6.so.1.0
14 0x0000000000000007 in ?? ()
15 0x00002b59d0e83042 in lookdict_string (mp=<value optimized out>, key=0x46424dc0, hash=40722104) at Objects/dictobject.c:412
16 0x00002aaab09d5458 in ?? ()
17 0x00002aaab09d5458 in ?? ()
18 0x00002aaab02a91f0 in ?? ()
19 0x00002aaab0b2c3a0 in ?? ()
20 0x0000000000000004 in ?? ()
21 0x00000000026d5eb8 in ?? ()
22 0x00002aaab0b2c3a0 in ?? ()
23 0x00002aaab071e080 in ?? ()
24 0x0000000046422bf0 in ?? ()
25 0x0000000046424dc0 in ?? ()
26 0x00000000026d5eb8 in ?? ()
27 0x00002aaab0987710 in ?? ()
28 0x00002b59d0ee2de2 in PyEval_EvalFrame (f=0x0) at Python/ceval.c:538
29 0x0000000000000000 in ?? ()
4

3 回答 3

3

您几乎可以肯定在您的 C++ 代码中使用指针做了一些不好的事情,这可能很难调试。

  • 不要假设堆栈跟踪是相关的。这可能是相关的,但指针滥用通常会导致一段时间后崩溃
  • 构建完整的警告。编译器可以指出一些不明显的指针误用,例如返回对本地的引用。
  • 调查您的阵列。std::vector尝试用(C++03) 或(C++11)替换数组,这样您就可以使用andstd::array进行迭代,并且可以使用.begin()end()at()
  • 调查你的指针。std::unique_ptr用(C++11) 或任何可能的地方替换它们(boost::scoped_ptr发布版本中应该没有开销)。shared_ptr用或替换其余部分weak_ptr。任何无法替代的东西都可能是有问题的逻辑的根源。

由于您所看到的问题,现代 C++ 允许完全删除几乎所有原始指针使用。试试看。

于 2013-01-24T14:20:11.633 回答
1

First things first, compile both your binary and libpython with debug symbols and push it out. The stack trace will be much easier to follow.

The relevant argument to g++ is -g.

于 2013-01-24T14:03:03.650 回答
1

建议:

  • 如前所述,提供完整的调试版本
  • 提供内存测试工具和CPU折磨测试
  • 分析核心转储时加载python库的调试符号
  • stacktrace 显示了一些关于 eval() 的内容,所以我猜你会进行动态代码生成和评估/执行。如果是这样,在此代码或传递的参数中,可能存在实际错误。在代码和代码转储的任何接口上的断言可能会有所帮助。
于 2013-01-24T14:16:50.520 回答