Как перенаправить ошибки запуска в STDERR? - PullRequest
3 голосов
/ 27 ноября 2010

У меня есть программа на C, которая использует PIPES для связи с внешним приложением.

Я использую EXECL для этого:

execl("./errorprogram","./errorprogram", NULL);

Теперь я также использовал DUP2 для перенаправления всех STDERR на конец записи канала

dup2(fd[1], STDERR_FILENO);

И если япроверьте, что с помощью простого скрипта Python, например:

data = sys.stdin.read() 
sys.stderr.write("Bad error\n")

, я могу с радостью прочитать эту ошибку обратно в "parent".

Теперь по моей проблеме: допустим, у меня есть дочерний элемент C "программа ", в которой есть утечка памяти или ошибка" недопустимый указатель ", например:

#include<stdio.h>
#include<string.h>

void main (){
    char szInput[1024];
     char *badvar;
    gets(szInput);

     badvar = realloc(badvar, 100);
    puts(szInput);
    fflush(NULL); 
}

Вышеприведенный оператор REALLOC специально намерен вызвать смерть программы, и я получу ошибку, подобную следующейво время выполнения (obvioulsy PARENT не затрагивается, только процесс CHILD):

* обнаружен glibc ./error: realloc (): неверный указатель: 0xb77a5250 **

И целая трассировка трасс и т. Д.

Теперь, как я могу получить любые ошибки времени выполнения, подобные этой, в STDERR, чтобы я мог прочитать полную трассировку обратно в родительский?

Нужно ли перенаправлять «ошибки времени выполнения в STDERR»?Конечно, можно уловить эти суетливые ошибки, возникшие у ребенка, чтобы родитель мог их записать и т. Д.?

Любая помощь или совет будет принята с благодарностью; -)

Спасибо

Линтон

Ответы [ 2 ]

5 голосов
/ 27 ноября 2010

По умолчанию Glibc выдаст вывод на управляющий терминал процесса, если таковой существует. Похоже, вы хотите установить переменную окружения LIBC_FATAL_STDERR_=1, которая вместо этого будет отправлять фатальные ошибки в stderr всегда.

0 голосов
/ 27 ноября 2010

Одним из возможных решений, если вы работаете в системе, которая поддерживает сигналы , например linux, является использование механизма сигнализации.Установка действия сигнала для недействительных ссылок на память (я полагаю, что это сигнал SIGSEGV) должна, я думаю, уловить конкретный пример, который вы привели выше.В обработчике вы можете распечатывать сообщения об ошибках в STDERR по своему желанию.Однако вам все равно нужен какой-то способ определения трассировки стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...