c++ - 由于段错误导致生产机器上的 C++ 应用程序崩溃

标签 c++ python linux segmentation-fault

由于 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 海湾合作委员会 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 ?? ()

最佳答案

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

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

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

关于c++ - 由于段错误导致生产机器上的 C++ 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14503074/

相关文章:

python - 将流水线与 sklearn 一起使用

python - 取消转置整数数组位的有效方法?

python - 如何将文件从Azure blob复制到Linux中的某些路径

regex - 如何在 bash 中使用变量进行 grep

c++ - 灵活的数组作为类成员

c++ - 为什么显式声明的构造函数会阻止使用 C++ 11 初始化列表进行成员初始化?

python - 未知符号 matplotlib mathtext

linux - 如何在 bash 中创建一个零拷贝、无容量、阻塞的管道?

C++ 断言在运行时 vector 上失败表达式 : vector subscript out of range

c++ - 在 GPU 上计算特征值和特征向量的性能不佳