2014-02-19 5 views
-1

다른 프로그램을 실행하는 내 C 프로그램에서 make를 호출합니다. 표준 출력과 표준 오류 모두를 파일로 리디렉션하고 있습니다. 그러나 세그먼트 화 결함으로 인해 make가 실행하는 프로그램이 종료되면 코어 덤프가 생성되어 make를 호출하는 주 프로그램의 콘솔 (표준 출력)에 인쇄됩니다.코어 덤프가 파일로 리디렉션

어떻게하면이 문제를 해결할 수 있으며 콘솔에 코어 덤프가 표시되지 않습니까?

다음

는 호출하는 내 코드 메이크업 :

make_logs 파일이 '개방'

감사

을 사용하여 열입니다
int pid = fork(); 

if(pid==0){ 
dup2(make_logs, 1); 
dup2(make_logs, 2); 
close(make_logs); 
execvp (args[0],args); 
} 

+0

명령 줄에서 프로그램 (또는 다른 프로그램)을 실행해도 동일한 문제가 없는지 확인하십시오. – Keith

+0

예, 동일한 프로그램을 실행하면 코어 덤프가 있음을 확인할 수 있습니다. 그러나 표준 출력과 오류가 모두 리디렉션되고 있기 때문에 이해할 수없는 것은 파일에 기록되어야하며 부모 프로세스까지 전파되지 말아야합니다 .. – user1479589

+1

여기서 프로그램을'strace -f'로 실행하면, 프로세스의 모든 syscalls를보고 무엇이 어떻게 전파되는지 살펴 보겠습니다. – nos

답변

1

내가 코어 덤프를 해결하려고하기보다는 억제하는 것 메시지가 표시되지만 분할 오류에 대한 메시지는 셸 (자식 종료 값을 감지하고 코어 덤프 상황을 인식 함)에 의해 생성되므로 fork() 및 fork()를 처리하는 자체 프로그램을 설치하여이를 억제 할 수 있습니다. wait()보다는 껍질을 가지고 일을한다.

은 제한 coredumpsize을 억제 0

샘플 사용, 코어 덤프를하지 않으려면 (실수 코드를, 당신은 정말 오류를 검사해야한다) :

#include <sys/types.h> 
#include <sys/wait.h> 


main(int argc, char **argv) 
{ 
    int pid; 
    if((pid = fork()) > 0) wait(0); 
    else if(pid == 0) { 
     execl("program-that-cdumps", "program-that-cdumps", 0); 
     perror("failed in execl"); 
    } else perror("failed in fork"); 
} 
+0

안녕하세요, 어떻게 크기를 제한하지 않고 fork() wait()에서 처리 할 수 ​​있습니까? – user1479589

+0

문제가 여전히 지속되면 원하지 않는 터미널에서 다음을 얻게됩니다. http://pastebin.com/V2yywTmW – user1479589

0

읽기 core(5)signal(7) 설명서 페이지를.

모든 프로그램을 gcc -Wall -g으로 컴파일하십시오. 그런 다음

file core 

을 사용하여 코어를 바이너리 처리하는 방법을 이해하십시오. 프로그램 foo이 코어를 버렸다고 말하는데 아마도 core dump from foo 같은 것을 말합니다. 그런 다음, 그 위에 부검 디버거를 시작

gdb foo core 

을 공통 gdb 명령을 사용하여 (특히 bt는 ... 등을 인쇄, p을 역 추적하기 위해).

메시지 dumped core은 일부 셸 (또는 셸처럼 작동하는 경우 make)으로 표시됩니다. core 파일이 stdout (큰 바이너리 파일)에 출력되지 않는다고 생각합니다.

당신은 피하고자하는 경우 core, 당신이 당신의 fork 후와 execvp을하기 전에 RLIMIT_COREsetrlimit(2) 콜과 0 한계를 호출 할 수 있습니다 (나쁜 생각이다 IMHO하는 core 덤프 뭔가 잘못의 좋은 증상입니다) . 나는 당신이 그것을하지 말아야한다고 믿는다. (또는 최소한 setrlimit이 호출되지 않는 어떤 방법을 가지고있다. 때때로 문제를 디버그하기 위해 core 덤프가 필요할 때가있다.)

core 덤프를 제공하는 문제를 해결해야합니다. dumped core 메시지를 피하십시오.

당신은 Makefile이 때문에 core 덤프가 사용자 프로그램입니다, 당신은 정말 core 일어나지 않았 음을 통보 사용자를 유지하려는 제공 사용자에 make을 실행, 그래서 당신이 core dumped 메시지를 유지해야합니다.

+0

나는 인쇄되고있는 백 트레이스 및 메모리 맵이없는 방법에 관심이 있습니다. 그 프로세스가 seg fault로 고통을 겪을 때 터미널에있는 자식 프로세스에 대해 ... 내가 잘못 주입을 수행 할 때 문제가 내 응용 프로그램과 관련하여 예상되므로 문제 해결에 관심이 없습니다. – user1479589

+0

BUMP !!!!! !!!!!! – user1479589

관련 문제