2014-12-22 4 views
0

openwrt 플랫폼 용 프로그램을 개발할 때 옵션 foreground로 프로세스를 시작하면 프로세스가 잘 실행됩니다.Ctrl + C를 사용하여 포어 그라운드에서 프로세스를 시작할 때 세그먼테이션 오류가 발생했습니다.

/usr/sbin/myprocess -f -b 

(" -f, --foreground  Run in the foreground\n") 
(" -b, --boot    Run with boot event\n") 

결국 Ctrl + C 명령으로 프로세스를 중지합니다. 이로 인해 세그멘테이션 오류가 발생합니다. 내 주요 프로그램에서

이 사용 된 코드는 다음과 같습니다 전경 모드로 실행 프로세스가 특정 방법을 중지해야하는 경우

void main() 
    { 
    .......... 
    .. 
    bool foreground = false; 
    while (1) { 
     c = getopt_long(argc, argv, "fb", long_opts, NULL); 
     if (c == EOF) 
      break; 
     switch (c) { 
      case 'b': 
       start_event |= BOOT; 
       break; 
      case 'f': 
       foreground = true; 
       break; 
      } 
     } 
    pid_t pid, sid; 

     if (!foreground) { // *fourground false* 
      pid = fork(); 
      if (pid < 0) 
       exit(EXIT_FAILURE); 
      if (pid > 0) 
       exit(EXIT_SUCCESS); 

      sid = setsid(); 
      if (sid < 0) { 
       D("setsid() returned error\n"); 
       exit(EXIT_FAILURE); 
      } 

      char *directory = "/"; 

      if ((chdir(directory)) < 0) { 
       D("chdir() returned error\n"); 
       exit(EXIT_FAILURE); 
      } 
     } 

    .......... 


    } 

내가 궁금합니다. 이 세분화 오류를 피하기 위해 C 코드를 수정하는 방법?

+0

어디에서 잘못 했습니까? 디버깅을 한 적이 있습니까? –

+0

어떤 디버그도 제공되지 않습니다. –

+0

openWrt 플랫폼에서이 seg fault를 디버깅하는 방법! –

답변

1

gdb에서 프로그램을 실행, -g로 프로그램을 컴파일합니다. 이 주소가 openwrt 인 경우 리모컨 gdb을 사용해야 할 수도 있습니다. 그게 segfault가 어디에 있는지 말해 줄 것입니다.

당신은 즉 당신 run 전에

handle signal int nostop noprint pass 

를 사용하면 프로그램에 ^C을 전달하는 방법을 알 수 있도록 this page를 읽을해야합니다.

디버깅 정보를 제공하지는 않았지만 SIGINT에 대한 신호 처리기 또는 신호를 트랩하는 것으로 가정하는 종료 코드에 문제가있는 것으로 생각됩니다. __atexit 또는 그 유사. 종료 루틴이 정리를 시도 할 때 종종 메모리 손상이 발생할 수 있습니다 - valgrind 아래에서 실행 해보십시오.