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

时间:2013-01-24 13:58:15

标签: 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。
  8. 请在下面找到我们投入的努力。

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

      以下是版本详情

      Red Hat 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 ?? ()
      

3 个答案:

答案 0 :(得分:3)

你几乎可以肯定在你的C ++代码中使用指针做错了,这可能非常难以调试。

  • 不要认为堆栈跟踪是相关的。它可能是相关的,但指针滥用通常会导致崩溃
  • 构建完整警告。编译器可以指出一些非明显的指针滥用,例如返回对本地的引用。
  • 调查您的数组。尝试用std::vector(C ++ 03)或std::array(C ++ 11)替换数组,这样您就可以使用begin()end()进行迭代,并且可以使用{{进行索引1}}。
  • 调查你的指针。尽可能用at()(C ++ 11)或std::unique_ptr替换它们(发布版本中不应有任何开销)。将其余部分替换为boost::scoped_ptrshared_ptr。任何无法替换的都可能是有问题逻辑的根源。

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

答案 1 :(得分:1)

首先,使用调试符号编译二进制文件和libpython并将其推出。堆栈跟踪将更容易遵循。

g++的相关论点是-g

答案 2 :(得分:1)

建议:

  • 如前所述,提供完整的调试版本
  • 提供内存测试工具和CPU酷刑测试
  • 分析核心转储时加载python库的调试符号
  • 堆栈跟踪显示有关eval()的内容,所以我猜你做动态代码生成和评估/执行。如果是这样,在此代码或传递的参数中,可能存在实际错误。在代码和代码转储的任何接口处断言都可能有所帮助。