2016-08-09 3 views
0

컴파일이 잘되었지만 시작시 충돌이 발생하여 InitInstance()에 도달하는 프로젝트에 문제가 있습니다. 내가 구조체에 문자열을 추가 한 후이 일이 : 나는 구조의 마지막 멤버를 추가 할 때구조체를 수정 한 후 앱이 손상 될 수 있습니다.

typedef struct 
{ 
long   nChannelIndex; 
TCHAR   szChannelName[32]; 
DWORD   dwStartTime;  // time_t 
DWORD   dwPlaytimeMs;  // msecs 
TCHAR   szStepName[32]; 
TCHAR   szFilename[MAX_PATH]; 
long   nLenMs; 
TCHAR   szStepDescr[64]; 
DWORD   dwSessionID; 
TCHAR   szLocationName[32]; 
long   bInsertion; 
BOOL   nOrigin;  // 0= local, 1= cuemaster, 
TCHAR   szList[32]; 
TCHAR   szFSPath[MAX_PATH]; << THIS HERE IS THE PROBLEM 
}REPORTDATA, *LPREPORTDATA; 

문제는 시작되었다. 배열 크기를 더 작은 숫자 (예 : 12)로 줄이면 응용 프로그램이 정상적으로 작동합니다.

나는 chkstk.asm에서 충돌을 얻을 -이 코드 주위에 : 윈도우 7 얼티밋 64 비트에서 나는 32 비트 C를 컴파일하고

; Find next lower page and probe 
cs20: 
sub  eax, _PAGESIZE_   ; decrease by PAGESIZE 
test dword ptr [eax],eax  ; probe page. 
jmp  short cs10 

++ 응용 프로그램입니다. Msvc 2010.

내 코드를 디버깅하도록 요청하지 않습니다. 충돌을 유발 한 원인과 발생한 위치를 보여주는 코드 만 포함하면됩니다.

어떤 아이디어? 도움 주셔서 감사합니다.

+1

로컬 변수로 이러한 구조의 큰 배열이 있습니까? –

+4

게시 된 코드로 진단 할 수 없습니다. [SSCCE] (http://sscce.org)를 게시하십시오. * 매우 * 최소한,이 monstrocity를 사용하여/코드를 게시하십시오. –

+0

SSCCE를 게시하는 것은 불가능합니다. 왜냐하면이 응용 프로그램은 괴상한 것입니다.최대 128 개 채널에서 상용 삽입을 처리 할 수있는 멀티 스레드 디지털 비디오 서버입니다. 그리고 이전에 말했듯이이 데이터에 액세스 할 수 없기 때문에 앱이 실행되는 즉시 충돌합니다. @ MarkRansom 아마 맞습니다. – aritosteles

답변

1

충돌이 발생한 모듈의 이름 chkstk.asm은 무슨 일이 일어나고 있는지에 대한 단서입니다. 너가 다 떨어지지 않았는지 확인하기 위해 스택 할당을 검사하고있다. 구조에 큰 새 요소를 추가하여 이 부족한 것처럼 보입니다. 단일 구조로 스택 공간을 다 쓰는 것은 매우 어렵습니다. 그래서 배열을 가지고 있다고 가정합니다. 로컬 변수는 스택에 할당되는 것이므로 문제는 이러한 구조의 배열을 포함하는 로컬 변수 일 가능성이 높습니다.

/F compiler switch을 사용하면 프로그램에 더 많은 스택 공간을 할당 할 수 있습니다.

배열 대신 vector을 사용할 수도 있습니다. 배열에서는 스택 대신 힙에 공간을 할당합니다.

0

제공 한 정보로는 정확하게 진단 할 수 없지만 스택 오버플로를 수행하는 것은 매우 안전한 가정입니다. Mark Ransom이 말했듯이 아마도 여러분은 어딘가에 스택에있는 이것들의 큰 배열을 가지고있을 것입니다.

EDIT : 일반적으로 로컬 변수는 저장되는 것은 아니지만 반드시 저장해야하는 스택은 일반적으로 스레드가 생성 될 때 할당되며 pthread_attr_setstacksize와 같은 OS 기능으로 구성 할 수 있습니다. 스택 공간이 부족합니다. 일반적으로 좋은 생각은 아니지만 작업중인 스레드의 스택을 늘리는 것입니다.

문제에 대한 가장 쉽고 안전한 해결책은 C malloc 또는 C++ new를 호출하여 힙에 큰 데이터를 할당하는 것입니다. 힙은 일반적으로 스택보다 크기가 훨씬 크지 만 데이터를 완료하면 명시적인 C free 또는 C++ 삭제가 필요하며 스택 변수와 같이 로컬 범위가 끝난 후에는 힙이 지워지지 않습니다.

힙 변수의 주된 관심사는 예를 들어 던지기를 통해 일찍 종료되는 함수를 통해 누출 될 것이라는 점입니다. 그래서 std :: unique_ptr을 사용하여 heap 객체를 저장할 때 RAII 개념을 따르는 것이 좋습니다.

+0

앱은 클라이언트가 구매 한 라이선스에 따라 24 개, 48 개, 96 개 또는 128 개가있을 수 있으므로 예. 이 문제를 어떻게 해결할 수 있습니까? – aritosteles

+0

나는 나의 대답을 확장 할 것이다. –

관련 문제