C-basada aplicación se bloquea cuando se ejecuta desde la consola cmd.exe, funciona muy bien en el depurador VS2008?

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

Pregunta

No está seguro de lo que está pasando aquí.
Tengo una aplicación de consola de Windows escrito en C. Cuando lo ejecuto desde el interior de VS2008, que funciona muy bien. Si lo ejecuto desde la línea de cmd.exe, se bloquea, por lo general en malloc (). Conjeturo que es una condición de carrera debido a una biblioteca CRT no coinciden.

La aplicación es sencilla.
Se pone en la capa WinHttp para enviar una petición GET a un sitio web, y luego succiona la respuesta. Esa parte parece funcionar bien, pero después de WinHttpReadData, el programa llama a printf () para imprimir los datos recibidos, y que es donde se produce el accidente menudo malloc.

Pero sólo fuera el depurador. ????

Estoy compilando desde la línea de comandos.

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

Veo los resultados anteriores si compila con / MT, o nada. Si compila con / MD, a continuación, se cuelga cuando se ejecuta en el depurador, en una llamada a free (), y se estrella en cmd.exe (igual que con / 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)    ?? 

Algunas preguntas -

  1. Es el diferente comportamiento a causa de la ruta disponible en VS2008?

  2. Podría ser la causa de que no tengo instalado en mi máquina del tiempo de ejecución VC90?

  3. pensé que mediante la vinculación estática (/ MT) no habría el requisito de tener el tiempo de ejecución VC90 para ser instalado?

  4. Yo todavía no entiendo / NODEFAULTLIB. Es eso relevante?

Estoy acostumbrado a los archivos make y compiladores, y sé C. No sé C ++ que es por eso que escribo en C. Pero no entiendo todos los caprichos del CRT en Windows. Alguien puede aclarar este misterio?

¿Fue útil?

Solución

Normalmente, cuando he visto que algo funcione en el depurador, pero en ninguna otra parte, es debido a la memoria sin inicializar. El depurador es "suficientemente bueno" para borrar la memoria para usted, como si eso le está haciendo un favor.

La segunda posibilidad es un desbordamiento de búfer y el depurador está causando la posición de memoria de sus mallocs para moverse lo suficiente para evitarlo. Sospecharía éste dada su falta está apareciendo durante una malloc; que podría estar corrompiendo la cadena malloc.

Otra posibilidad que se destaca es algún tipo de condición de carrera, y el depurador está cambiando el tiempo suficiente para dejar pasar con él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top