2009-07-16 3 views
0

여기 무슨 일인지 잘 모르겠습니다.
C로 작성된 Windows 콘솔 앱이 있습니다. VS2008에서 실행하면 정상적으로 실행됩니다. cmd.exe 프롬프트에서 실행하면 일반적으로 malloc()에서 충돌합니다. 나는 이것이 CRT 라이브러리가 일치하지 않아 경쟁 조건이라고 추측합니다.cmd.exe에서 실행할 때 C 기반 콘솔 응용 프로그램이 충돌하고 VS2008 디버거에서 제대로 실행됩니까?

앱이 간단합니다.
WinHttp 레이어를 호출하여 웹 사이트에 GET 요청을 보낸 다음 회신을 중단합니다. 그 부분은 잘 작동하는 것처럼 보이지만 WinHttpReadData 이후에 프로그램은 printf()를 호출하여 수신 된 데이터를 인쇄하고 malloc 충돌이 자주 발생합니다.

바깥에만 디버거가 있습니다. ???

커맨드 라인에서 컴파일 중입니다.

c:\vc9\bin\cl.exe /Zi /DEBUG -Ic:\vc9\Include 
      -IC:\WindowsSDK\v6.1\Include HttpGet.c 
      -link /debug /out:HttpGet.exe /SUBSYSTEM:CONSOLE /LIBPATH:c:\vc9\Lib 
       /LIBPATH:C:\WindowsSDK\v6.1\Lib WinHttp.lib 

은 내가/MT, 또는 아무것도 컴파일하면 위의 결과를 참조하십시오./MD로 컴파일하면 디버거에서 실행될 때 free()에 대한 호출에서 중단되고 cmd.exe에서 충돌합니다 (/ MT와 동일).

run in    result: /MT   result: /MD 
---------   ------------   ----------- 
VS2008 debugger runs fine    hang in free() (at the end) 
cmd.exe   crash in malloc  crash in malloc 
"VC cmd prompt" crash or hang(spin) ?? 

몇 가지 질문 -

  1. 때문에 VS2008 내에서 사용 가능한 경로의 다른 행동인가?

  2. 내 컴퓨터에 VC90 런타임이 설치되지 않았습니까?

  3. 정적으로 링크하면 (/ MT) VC90 런타임을 설치할 필요가 없다는 생각이 들었습니까?

  4. 나는 아직도 이해할 수 없다/NODEFAULTLIB. 그게 관련이 있니?

나는 메이크와 컴파일러를 사용하고, 나는 내가 C. 쓸 이유입니다 ++ C를 모르는하지만 Windows에서 CRT의 모든 변덕을 이해하지 못하는 C. 알고있다. 누군가이 수수께끼를 해결할 수 있습니까?

답변

3

일반적으로 디버거에서 작동하지만 어디에도 다른 작업이있는 경우 초기화되지 않은 메모리 때문입니다. 디버거는 마치 당신에게 유리한 것처럼 당신을 위해 메모리를 정리할 수있는 "좋은"것입니다.

두 번째 가능성은 버퍼 오버런이며 디버거는 malloc의 메모리 위치를 피하기 위해 이동할 수 있습니다. 당신의 실패가 malloc 동안 나타나고 있다고 생각됩니다. 당신은 malloc 체인을 손상시킬 수 있습니다.

두드러진 또 다른 가능성은 일종의 경쟁 조건이며 디버거는 타이밍을 변경하여 충분히 빠져 나갈 수 있습니다.

+0

음, 좋아. 좋은 생각. 나는 C#을 너무 오랫동안 해왔다. – Cheeso

+0

OP가 Windows에 있기 때문에 조금 어렵지만 Valgrind에서 프로그램을 실행하면 디버거가 숨기는 메모리 오류를 잡아낼 수있다. Glibc는 또한'MALLOC_PERTURB_'가 설정되어있을 때 사용되지 않는 모든 메모리를 특별한 패턴으로 표시 할 것이고,'NULL' 이외의 패턴은 에러 잡기에 좋다. 윈도우의 CRT에 상응하는 것이 있는지 나는 모른다. – ephemient

+0

나는 약간의 버퍼 오버런이 있었다. 조잡한 조잡한 조잡한. .NET에서 어떤 코딩을 얻을 수 있는지 알아보십시오.어쨌든 알림을 주셔서 감사합니다. – Cheeso

관련 문제