Программа C++ Всегда Катастрофические отказы При выполнении станд.:: строка присваивается

Я пытался отладить катастрофический отказ в своем приложении, которое разрушает (т.е. утверждает * glibc обнаруженный * свободный (): недопустимый указатель: 0x000000000070f0c0 ***), в то время как я пытаюсь сделать простое, присваивают строке. Обратите внимание, что я компилирую в системе Linux с gcc 4.2.4 с набором уровня оптимизации к-O2. С-O0 больше не отказывает приложение.

Например.

std::string abc;

abc = "testString";

но если я изменил код следующим образом, он больше не отказывает

std::string abc("testString");

Таким образом, снова я поцарапал голову! Но интересный шаблон был то, что катастрофический отказ, перемещенный позже в приложение, СНОВА в другой строке. Я нашел это странным, что приложение непрерывно отказывало на строке, присваиваются. Типичный след катастрофического отказа посмотрел бы следующим образом:

#0  0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
(gdb) bt
#0  0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
#1  0x00007f2c2663dbc3 in abort () from /lib64/libc.so.6
#2  0x00000000004d8cb7 in people_streamingserver_sighandler (signum=6) at src/peoplestreamingserver.cpp:487
#3  <signal handler called>
#4  0x00007f2c2663bfb5 in raise () from /lib64/libc.so.6
#5  0x00007f2c2663dbc3 in abort () from /lib64/libc.so.6
#6  0x00007f2c26680ce0 in ?? () from /lib64/libc.so.6
#7  0x00007f2c270ca7a0 in std::string::assign (this=0x7f2c21bc8d20, __str=<value optimized out>)
    at /home/bbazso/ThirdParty/sources/gcc-4.2.4/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:238
#8  0x00007f2c21bd874a in PEOPLESProtocol::GetStreamName (this=<value optimized out>,
    pRawPath=0x2342fd8 "rtmp://127.0.0.1/mp4:pop.mp4", lStreamName=@0x7f2c21bc8d20)
    at /opt/trx-HEAD/gcc/4.2.4/lib/gcc/x86_64-pc-linux-gnu/4.2.4/../../../../include/c++/4.2.4/bits/basic_string.h:491
#9  0x00007f2c21bd9daa in PEOPLESProtocol::SignalProtocolCreated (pProtocol=0x233a4e0, customParameters=@0x7f2c21bc8de0)
    at peoplestreamer/src/peoplesprotocol.cpp:240

Это было действительно странным поведением и таким образом, я начал вводить по абсолютному адресу вокруг далее в моем приложении, чтобы видеть, было ли своего рода повреждение памяти (или "куча" или стек) ошибка, которая могла бы происходить, который мог вызывать это странное поведение. Я даже проверил на ptr повреждения и подошел пустой врученный. В дополнение к визуальному контролю кода я также попробовал следующие инструменты:

  • Valgrind с помощью и memcheck и exp-ptrcheck
  • электрический забор
  • libsafe
  • Я скомпилировал с-fstack-protector-all в gcc
  • Я попробовал набор MALLOC_CHECK_ к 2
  • Я выполнил свой код посредством проверок линта, а также cppcheck (для проверки на ошибки)
  • И я ступил через код с помощью gdb

Таким образом, я попробовал много материала и все еще подошел пустой врученный. Таким образом, я задавался вопросом, могло ли это быть что-то как проблема компоновщика или какая-то проблема библиотеки, которая могла бы вызывать эту проблему. Есть ли, любой знает проблемы со станд.:: строка, которые делают, восприимчива к катастрофическому отказу в-O2, или возможно это не имеет никакого отношения к уровню оптимизации? Но единственный шаблон, который я вижу к настоящему времени в моей проблеме, - то, что это всегда, кажется, отказывает на строке и таким образом, я задавался вопросом, знал ли кто-либо каких-либо проблем, что мой вызывал этот тип поведения.

Большое спасибо!

11
задан bbazso 22 February 2010 в 14:15
поделиться

3 ответа

Можете ли вы повторить сбой с помощью базовой двухстрочной программы?

#include <string>

int main()
{
    std::string abc;
    abc = "testString";
}

Если произойдет сбой, опубликуйте, пожалуйста, ваши точные параметры компиляции / связывания?

Если нет, начните сокращать свой код. Удаляйте строки по горстке за раз, пока ошибка не исчезнет. Если у вас есть другое изменение, которое вы можете добавить, чтобы вызвать сбой, и удалите, чтобы он исчез, это должно помочь вам найти проблему.

7
ответ дан 3 December 2019 в 06:46
поделиться

Как вы сказали, это странное поведение.

Честно говоря, я думаю, что вы тратите время на поиск возможной ошибки с std :: strings. Струны совершенно безопасны, если вы правильно их используете.

В любом случае, с информацией, которую вы даете: Во-первых, вы используете потоки? Это может быть проблема с потоком. Во-вторых, вы проверяете свою программу с помощью valgrind. У вас вообще нет предупреждений?

Примечание: самые важные предупреждения valgrind - это недопустимое чтение и недопустимая запись.

PS: Как сказано в комментарии, вам, вероятно, следует использовать g ++ для компиляции кода C ++;)

0
ответ дан 3 December 2019 в 06:46
поделиться

Это первоначальное предположение, использующее всю информацию, которую я могу извлечь из вашей обратной трассировки.

Вы, скорее всего, смешиваете и сопоставляете версию gcc, компоновщик и libstdc ++, что приводит к необычному поведению на хост-машине:

  1. libc - это система: /lib64/libc.so.6
  2. libstdc ++ - это в каталоге "ThirdParty" - это подозрения, поскольку он говорит мне, что он мог быть скомпилирован в другом месте с другой целью - /home/bbazso/ThirdParty/sources/gcc-4.2.4/x86_64-pc-linux-gnu / libstdc ++ - v3 /
  3. Еще одна библиотека libstdc ++ в / opt : /opt/trx-HEAD/gcc/4.2.4/lib/gcc/x86_64-pc-linux-gnu/4.2 .4 /../../../../ include / c ++ / 4.2.4 / bits / basic_string.h: 491

Кроме того, GCC может смешивать системный ld вместо себя, что может вызвать дальнейшие странные использование карт памяти.

10
ответ дан 3 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: