2016-09-08 11 views
0

Есть уже некоторые подходы к этому вопросу. ¹² ³Сегментация Неисправность возникает, если нет std :: flush

Но этот совершенно другой! Если я прокомментирую строку std::flush, произойдет Segfault, но если я добавлю эту строку, ошибка сегментации не произойдет!

int Stm32Serial::writeToSerial() 
{ 
    /// TODO Write handle for writing if necessary 
    /// int serial_write_ret; 
    if (USE_USB) 
    { 
     usb_port.writeBytes (stm_buf_t, stm_buf_t[LENGTH_INDEX]); 
     return SERIAL_RET; 
    } 
    else 
    { 
     std::cout << std::flush; // TODO HACK Remove it! 
     serial_port.sendBuff (stm_buf_t, stm_buf_t[LENGTH_INDEX]); 
     return SERIAL_RET; 
    } 
} 

Также я попробовал gdb; Я использую эту функцию в ROS с this техникой отладки и compiling with -g option, но не печатает имена функций

Program received signal SIGSEGV, Segmentation fault. 
__mempcpy_sse2() at ../sysdeps/x86_64/memcpy.S:142 
142 ../sysdeps/x86_64/memcpy.S: No such file or directory. 
(gdb) bt 
#0 __mempcpy_sse2() at ../sysdeps/x86_64/memcpy.S:142 
#1 0x6564656563786520 in ??() 
#2 0x20726f7272652064 in ??() 
#3 0x6c6f687365726874 in ??() 
#4 0x2e30203a79622064 in ??() 
#5 0x202c323537373431 in ??() 
#6 0x697420656c637963 in ??() 
#7 0x36312e30203a656d in ??() 
#8 0x2c31343936373632 in ??() 
#9 0x6f68736572687420 in ??() 
#10 0x32302e30203a646c in ??() 
#11 0x742064616572202c in ??() 
#12 0x312e30203a656d69 in ??() 
#13 0x3530333430353233 in ??() 
#14 0x657461647075202c in ??() 
#15 0x30203a656d697420 in ??() 
#16 0x373430353233312e in ??() 
#17 0x74697277202c3234 in ??() 
#18 0x203a656d69742065 in ??() 
#19 0x3637363236312e30 in ??() 
#20 0x006d305b1b333637 in ??() 
#21 0x00007fffffffbbf0 in ??() 
#22 0x00000000ffffbbd8 in ??() 
---Type <return> to continue, or q <return> to quit--- 
#23 0x00007fff00000000 in ??() 
#24 0x0000000000000000 in ??() 
(gdb) 
  • Искал LENGTH_INDEX и stm_buf_t[], там все в порядке.

А также; Если я вызываю std::cout << std::flush; из другого места, которое имеет вызов этой функции, оно также обрабатывает Segfault!

... 
genSum (stm_buf_t); 
writeToSerial(); 
std::cout << std::flush; 
... 

Какой может быть мой следующий подход?

+2

Привет @Orhan G. Hafif, пытались ли вы использовать отладчик памяти (например, valgrind)? – vadikrobot

+0

Hi @vadikrobot, я только что попробовал и увидел ценные результаты. Я напишу об этом позже. Благодаря! я –

ответ

3

Опытный ботаник заметит, что стек заполнен ASCII. Это почти всегда является признаком переполнения буфера в strcpy или аналогичном для локальной переменной.

Я преобразовал некоторые из адресов стека от шестнадцатиричного до ASCII. Кажется, он читает назад.

rorre dedeecxe rorre dlohserht.0: Yb д, 257741it elcyc61.0: ет, 1496762ohserht 20,0: DLT Daer, 1,0: emi50340523etadpu, 0: испускают

Первый бит, как представляется, сказать 'порог ошибки превысил ошибку' , Вы просматриваете в себе код или входной файл для этого текста и смотрите, где он используется в коде. Почти наверняка будет копия памяти, которая перезаписывает локальный буфер.

Как отмечается в комментарии, Valgrind часто найдет такую ​​проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^