2012-02-20 2 views
0

나는 다중 스레드 프로그램을 만들고있다. 모든 스레드를 제대로 닫을 수 있지만 끝 부분에 오류가 있습니다. 그러나 나는 단지 밖으로 인쇄 후이 얻을, 나는 GDB에서 디버깅을 시도파일을 열거 나 닫을 때 분할 오류가 발생 했습니까?

char *pid_fname; 
FILE *file; 

sprintf(pid_fname, "%s%d%s", "/proc/", pid, "/stat"); 
file = fopen(pid_fname, "r"); 

/* code */ 

fclose(file); 

: 내 코드의 특정 부분을 주석을 통해, 나는 그것이 파일을 닫는/개방 처리하는 코드의 영역 내에 발견 segfault 이후의 'where':

#0 0x2f312f63 in ??() 
#1 0x74617473 in ??() 
#2 0xbfaee700 in ??() 
#3 0xbfaee77c in ??() 
#4 0x006a7810 in ??() 
#5 0x00000000 in ??() 

아무도 나에게 여기에서 어디로 가야할지에 대한 조언을 줄 수 있습니까?

+0

: 당신이 정말로 버그에서 보호하려면 여전히 동적 할당에 대해 걱정하지 동안, 당신은 같은 것을 사용할 수 있습니다 함수'라고한다. 당신은 경고와 같은 런타임 크래시를 방지하는 데 도움이 될 수있는주의를 기울여야합니다. 또한 디버그 기호를 얻으려면 [디버깅 옵션] (http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options)을 사용해야합니다 (gcc를 사용한다고 가정) –

답변

3

파일 이름에 대한 백업 저장소가 없습니다. 포인터를 만들었지 만 공간을 할당하지 않았습니다. 즉, 쓰지 않으려는 곳을 거의 확실히 가리킬 수 있습니다 :-)

프로세스 ID의 최대 범위 (예 : 5 자리)를 알고 있다고 가정하면 가장 간단한 수정은 인수 약간 이후 /proc//stat 고정 문자열) : 메모리가 부족하면

char pid_fname[sizeof("/proc/99999/stat")]; 
sprintf(pid_fname, "/proc/%d/stat", pid); 

그렇지 않으면, 당신은 동적으로 수비에 충분한 실제 pid 값에 따라 공간 및 코드를 할당해야합니다.

시스템은 프로세스 ID에 고정 된 범위를 갖는 경향이 있으므로 고정 크기 버퍼를 선택합니다. 'pid_fname'이에서 초기화되지 않은 사용 : 매우 당신이 경고 '와 같은 경고를 가지고 할 가능성이

char pid_fname[sizeof("/proc/99999/stat")]; 
if ((pid < 0) || (pid > 99999)) { 
    fprintf (stderr, "WTH? What sort of PID was that (%d)?\n", pid); 
    exit (1); 
} 
sprintf(pid_fname, "/proc/%d/stat", pid); 
+0

자세한 게시물, 고맙습니다! – Kobi

3

sprintf은 첫 번째 인수가 호출자가 할당 한 버퍼에 대한 포인터가되어야합니다. pid_fname도 초기화하지 않았습니다.

1
char *pid_fname; 
sprintf(pid_fname, "%s%d%s", "/proc/", pid, "/stat"); 

는 초기화되지 않은 포인터입니다. 이 경우 제공된 인수는 버퍼에 복사 할 수 없습니다.

관련 문제