Я пытался отладить катастрофический отказ в своем приложении, которое разрушает (т.е. утверждает * 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 повреждения и подошел пустой врученный. В дополнение к визуальному контролю кода я также попробовал следующие инструменты:
Таким образом, я попробовал много материала и все еще подошел пустой врученный. Таким образом, я задавался вопросом, могло ли это быть что-то как проблема компоновщика или какая-то проблема библиотеки, которая могла бы вызывать эту проблему. Есть ли, любой знает проблемы со станд.:: строка, которые делают, восприимчива к катастрофическому отказу в-O2, или возможно это не имеет никакого отношения к уровню оптимизации? Но единственный шаблон, который я вижу к настоящему времени в моей проблеме, - то, что это всегда, кажется, отказывает на строке и таким образом, я задавался вопросом, знал ли кто-либо каких-либо проблем, что мой вызывал этот тип поведения.
Большое спасибо!
Можете ли вы повторить сбой с помощью базовой двухстрочной программы?
#include <string>
int main()
{
std::string abc;
abc = "testString";
}
Если произойдет сбой, опубликуйте, пожалуйста, ваши точные параметры компиляции / связывания?
Если нет, начните сокращать свой код. Удаляйте строки по горстке за раз, пока ошибка не исчезнет. Если у вас есть другое изменение, которое вы можете добавить, чтобы вызвать сбой, и удалите, чтобы он исчез, это должно помочь вам найти проблему.
Как вы сказали, это странное поведение.
Честно говоря, я думаю, что вы тратите время на поиск возможной ошибки с std :: strings. Струны совершенно безопасны, если вы правильно их используете.
В любом случае, с информацией, которую вы даете: Во-первых, вы используете потоки? Это может быть проблема с потоком. Во-вторых, вы проверяете свою программу с помощью valgrind. У вас вообще нет предупреждений?
Примечание: самые важные предупреждения valgrind - это недопустимое чтение и недопустимая запись.
PS: Как сказано в комментарии, вам, вероятно, следует использовать g ++ для компиляции кода C ++;)
Это первоначальное предположение, использующее всю информацию, которую я могу извлечь из вашей обратной трассировки.
Вы, скорее всего, смешиваете и сопоставляете версию gcc, компоновщик и libstdc ++, что приводит к необычному поведению на хост-машине:
/lib64/libc.so.6
/home/bbazso/ThirdParty/sources/gcc-4.2.4/x86_64-pc-linux-gnu / libstdc ++ - v3 /
/ 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 вместо себя, что может вызвать дальнейшие странные использование карт памяти.