2017-07-10 91 views
5

TL; DRWyświetlanie lub przekierowujące komunikaty sterujące praca skorupę za

Wszystko kontrola pracy/zderzeniowe wiadomości są ukryte, gdy występują one w obrębie funkcji. Pójdę do bardziej szczegółowo poniżej, ale @Barmar wskazał, że ten problem może być powielana uruchamiając upaść binarnego wewnątrz funkcji, np:

crun() { 
    /tmp/faulty $1 $2 $3 
} 

Mam zdefiniowano funkcję w moim .zshrc do skompilować kod źródłowy & biegać z funkcji poniżej:

crun() { 
    local file=$1 
    shift 
    local exepath="$(mktemp)" 

    if [[ $file =~ "\.c$" ]]; then 
     gcc -g -Wall $file -o $exepath || return $? 
    else 
     echo "no filetype detected" 
     return 126 
    fi 

    $exepath "[email protected]" 
} 

który można nazwać w ten sposób:

% crun source.cc arg_1 arg_2 

Działa to w przypadku zwykłych programów, ale ma problem z tym, że komunikaty sterowania zadaniami powłoki, takie jak te generowane z segfault, nie pojawiają się.

Jako przykład:

% echo 'int main=0;' >> /tmp/faulty.C# a crashing c program 
% crun faulty.c 
% # no output generated 

Zważywszy równoważnych interaktywnych poleceń by wygenerować to:

% g++ faulty.c -o /tmp/faulty && /tmp/faulty 
[1] 2894 segmentation fault (core dumped) # zsh's job control output for SIGSEGV 

Czy istnieje jakiś sposób, aby wyświetlać te wiadomości o awarii wykonywalnego, którego ścieżka jest dynamicznie obliczane? Idealnie bez pisania własnych procedur obsługi pułapka/sygnałowe + exec korzystając sh -c "$exepath [email protected]" lub pisząc zupełnie nowy system(3) opakowanie całkowicie)

+0

Nie rozumiem tego na bok. Mówisz, że działa poprawnie podczas uruchamiania 'crun' wewnątrz samej powłoki. Jak inaczej działasz, gdy to nie działa? – Barmar

+0

@Barmar Masz rację, to było całkowicie zagmatwane, usunąłem to. Zasadniczo * można * uzyskać komunikaty sterowania zadaniami, uruchamiając 'crun' wewnątrz innego pliku i uruchamiając wygenerowany plik binarny za pomocą' exec' (ponieważ obraz procesu powłoki jest zamieniany na program, który zawiera błędy, które przechwytuje nadrzędna powłoka)). Uwzględniłem tylko kwestię różnicy między wykonaniem interaktywnym i nieinteraktywnym oraz jak to może być istotne. –

+1

Kiedy próbuję twojej funkcji, zawsze otrzymuję komunikat "Nie wykryto rodzaju pliku" - wystąpił problem z 'if'. Kiedy to wyjmuję, otrzymuję komunikat o uszkodzeniu segmentacji od powłoki. – Barmar

Odpowiedz

1

można uzyskać zsh wydrukować komunikat błędu segmentacji z pracy, jeśli zaczniesz je jako zadanie w tle i następnie natychmiast przenieś go na pierwszy plan.

"$exepath" "[email protected]" & 
fg 

Spowoduje zsh wydrukować wiadomości dla sygnałów na pracę rozpoczął na $exepath.

Minusem jest to, że dostaniesz trochę więcej niż się spodziewasz:

% crun faulty.c 
faulty.c:1:5: warning: ‘main’ is usually a function [-Wmain] 
int main=0; 
    ^~~~ 
[2] 2080 
[2] - running "$exepath" "[email protected]" 
zsh: segmentation fault (core dumped) "$exepath" "[email protected]" 

Ale jak widać, dostaniesz wiadomości wysypać drukowanych w terminalu.

Ponieważ komunikaty są drukowane przez powłokę interaktywną, a nie przez niepowodzenie, komunikaty zadań nie zostaną przekierowane w przypadku próby przekierowania pod numer stdout lub stderr.

Tak więc z jednej strony, jeśli spróbujesz wyciągnąć użyteczne dane z uruchomionego procesu i przekierujesz je gdzie indziej, nie musisz się martwić, że wiadomości o pracę staną na przeszkodzie. Ale oznacza to również, że nie otrzymasz komunikatu segfault, jeśli spróbujesz przekierować go przez przekierowanie stderr.

Oto demonstracji tego efektu, z przerwami linii dodanych w między poleceniami dla jasności:

% crun good.c > test 
[2] 2071 
[2] - running "$exepath" "[email protected]" 

% cat test 
Hello, world! 

% crun faulty.c 2>test 
[2] 2092 
[2] - running "$exepath" "[email protected]" 
zsh: segmentation fault (core dumped) "$exepath" "[email protected]" 

% cat test 
faulty.c:1:5: warning: ‘main’ is usually a function [-Wmain] 
int main=0; 
    ^~~~ 

Aby uzyskać więcej informacji, zobacz zsh's documentation on jobs and signals. Możesz także zaglądać w okolice the C file where the magic happens.