CMD.Exe에서 실행될 때 C 기반 콘솔 앱 충돌은 VS2008 디버거에서 잘 실행됩니까?

StackOverflow https://stackoverflow.com/questions/1135337

문제

여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다.
C로 작성된 Windows 콘솔 앱이 있습니다. VS2008 내에서 실행하면 잘 실행됩니다. cmd.exe 프롬프트에서 실행하면 일반적으로 malloc ()에서 충돌합니다. 불일치 한 CRT 라이브러리로 인해 인종 조건이라고 생각합니다.

앱은 간단합니다.
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로 컴파일하면 디버거에서 실행될 때 무료 ()로 전화를 걸고 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 ++를 알지 못합니다. 그래서 나는 C에 글을 쓰는 이유입니다. 누군가이 미스터리를 정리할 수 있습니까?

도움이 되었습니까?

해결책

일반적으로 디버거에서 무언가가 작동했지만 다른 곳은 없었을 때, 그것은 초기화되지 않은 메모리 때문입니다. 디버거는 마치 당신에게 호의를 베푸는 것처럼 기억을 지우기에 "충분히 좋다".

두 번째 가능성은 버퍼 오버런이며, 디버거는 Mallocs의 메모리 위치를 피하기에 충분히 움직이게합니다. 나는 당신의 실패가 malloc 동안 나타나고 있다고 생각할 것입니다. malloc 체인을 손상시킬 수 있습니다.

눈에 띄는 또 다른 가능성은 일종의 경주 조건이며, 디버거는 타이밍을 충분히 바꿀 수 있도록 타이밍을 변경하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top