Vaclav_ Ответов: 1

Как решить проблему синхронизации cout / cerr / perror?


Я разместил это на разных форумах и здесь, я знаю , в чем проблема ( нет необходимости повторять это здесь), но у меня действительно нет решения.

Я использую cout для отслеживания процесса кода, работает нормально.
Я использую perror для идентификации кода erros - там, где это применимо.
Даже когда perror возвращает "недопустимый аргумент", это помогает при отладке.

perror / cerr не следуют потоку кода.

Согласно ответам , которые я получил , и cout, и perror/cerr буферизуются, но фактические выходы perror/cerr на консоль (терминал) никогда не помещаются в одно и то же "место", но в основном в конце выполнения кода.

perror/cerr выводятся красным цветом - это помогает , Но я действительно хотел бы иметь их в правильной кодовой последовательности.

Я не знаю, как буферизировать/ unbuffer perror/ cerr, поэтому он выводит данные в правильной кодовой последовательности.


Я долго откладывал решение, теперь я открыт для предложений, как это исправить,

Прилагаемый код и выходные данные демонстрируют эту проблему.

<pre>	if (FileDescriptor_socket) {
		cout << "Synchronize  @line " << __LINE__ << endl;
		perror("socket allocated SUCCESS");
		cerr << "socket allocated SUCCESS" << endl;
		cout << "Synchronize  @line " << __LINE__ << endl;
		return 0;


STOP  @line 1437
Synchronize  @line 1445

I like to see perror/cerr here 


Synchronize  @line 1448
STOP  @line 744
SUCCESS SERVER.AllocateSocket() 
function Socket_RX_Composite
STOP  @line 749
TASK @line 753
function Socket_RX_Composite
STOP  @line 755
Not here 
socket allocated SUCCESS: Success
socket allocated SUCCESS


Что я уже пробовал:

Размещенные на эфферентных форумах, это всего лишь 30 символов заполнения по мере необходимости.

Richard MacCutchan

Когда я запускаю приведенный выше код, я получаю следующий вывод:

Synchronize  @line 31
socket allocated SUCCESS: No error
socket allocated SUCCESS
Synchronize  @line 34

Так где же генерируется весь остальной текст?

1 Ответов

Рейтинг:
6

k5054

В дополнение к использованию flush, вы рассматривали возможность использования strerror(), вместо perror()

напр.

#include <cstring>
#include <cerrno>
#include <iostream>

void perror_cpp(const char *message)
{
    std::cerr << message << ": " << strerror(errno) << std::endl << std::flush;
}



Вы также можете добавить туда свою раскраску, чтобы очистить свой отладочный код, и это достаточно просто, чтобы его можно было пометить inline.


Vaclav_

Извините, но так как это была давняя проблема, я совершенно забыл о "Флеше". Да, я использовал его, и это не помогло. Но я попробую еще раз.
Я и стрэррору дам попробовать. Спасибо

k5054

Я еще не пробовал этого, но, возможно, отключите буферизацию как для cerr, так и для cout: подробнее здесь https://stackoverflow.com/a/156413

Vaclav_

Я чувствую, что это может пролить некоторый свет на проблему.
Вот цитаты из других источников:
"по умолчанию cout буферизуется" и "новая строка в конце cout очистит буфер"
С этим - проблема все равно не с cout , а с cerr / perror.

Я могу добавить endl или /n к cerr или добавить flush ко всей линии cerr.

Не знаю, как "добавить" такое в perror - так как он печатает сначала необязательное сообщение, а затем фактический текст "errno" .

k5054

ну, вы могли бы fflush(stderr).
Или вы можете использовать приведенный выше фрагмент кода. sterror() возвращает строку ошибки, связанную с текущим errno, так что мой perror_cpp дублирует функциональность perror(), но отправляет вывод через std::cerr. Обратите внимание, что в приведенном коде окончательный << std::flush вероятно, это не совсем необходимо, так как std::endl предполагается, что он тоже должен сделать флеш.

Vaclav_

РЕШЕННЫЙ
Чистота...perror_cpp печатает именно там, где он делает больше всего хорошего.
Отслеживание поведения сокетов в режиме реального времени!
Спасибо