CMD.Exe에서 실행될 때 C 기반 콘솔 앱 충돌은 VS2008 디버거에서 잘 실행됩니까?
-
16-09-2019 - |
문제
여기서 무슨 일이 일어나고 있는지 잘 모르겠습니다.
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) ??
몇 가지 질문 -
VS2008 내에서 사용 가능한 경로로 인해 다른 행동이 있습니까?
원인이 내 컴퓨터에 VC90 런타임이 설치되어 있지 않아서 원인이 될 수 있습니까?
통계 (/mt)를 연결함으로써 VC90 런타임을 설치해야 할 필요가 없다고 생각 했습니까?
나는 아직도 /nodefaultLib를 이해하지 못한다. 그게 관련이 있습니까?
나는 파일과 컴파일러를 만들어내는 데 익숙하고 C를 알고 있습니다. C ++를 알지 못합니다. 그래서 나는 C에 글을 쓰는 이유입니다. 누군가이 미스터리를 정리할 수 있습니까?
해결책
일반적으로 디버거에서 무언가가 작동했지만 다른 곳은 없었을 때, 그것은 초기화되지 않은 메모리 때문입니다. 디버거는 마치 당신에게 호의를 베푸는 것처럼 기억을 지우기에 "충분히 좋다".
두 번째 가능성은 버퍼 오버런이며, 디버거는 Mallocs의 메모리 위치를 피하기에 충분히 움직이게합니다. 나는 당신의 실패가 malloc 동안 나타나고 있다고 생각할 것입니다. malloc 체인을 손상시킬 수 있습니다.
눈에 띄는 또 다른 가능성은 일종의 경주 조건이며, 디버거는 타이밍을 충분히 바꿀 수 있도록 타이밍을 변경하고 있습니다.