تعطل تطبيق وحدة التحكم المستندة إلى C عند تشغيله من cmd.exe، يعمل بشكل جيد في مصحح الأخطاء VS2008؟

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

سؤال

لست متأكدا ما يحدث هنا.
لدي تطبيق Windows Console مكتوب في C. عندما أقوم بتشغيله من داخل VS2008، فإنه يعمل بشكل جيد. إذا قمت بتشغيله من موجه cmd.exe، فإنه يتعطل، عادة في malloc (). أنا أظن أنه حالة سباق بسبب مكتبة CRT غير متطابقة.

التطبيق بسيط.
يستدعي طبقة Winhttp لإرسال طلب الحصول على موقع على شبكة الإنترنت، ثم يضيء الرد. يبدو أن هذا الجزء يعمل بشكل جيد، ولكن بعد Winhtpreaddata، يستدعي البرنامج 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. هل هذا مهم؟

أنا معتاد على Makefiles والتركيبات، وأنا أعلم C. لا أعرف C ++ وهذا هو السبب في أنني أكتب في C. لكنني لا أفهم كل الإغراق في CRT على Windows. هل يمكن لأي شخص أن يلقي هذا اللغز؟

هل كانت مفيدة؟

المحلول

عادة عندما رأيت شيئا يعمل في المصحح ولكن في أي مكان آخر، فمن المقرر أن يكون الذاكرة غير المهجورة. المصحح هو "لطيف بما فيه الكفاية" لمسح الذاكرة بالنسبة لك، كما لو كان هذا هو أن تفعل لك معروفا.

الاحتمال الثاني هو تجاوز المخزن المؤقت، ويسبب المصحح في موقع الذاكرة الخاصة بك في mallocs الخاص بك للتحرك بما يكفي لتجنب ذلك. وأود أن أظن أن هذا واحد بالنظر إلى فشلك يظهر خلال malloc؛ قد تكون تفسد سلسلة MALOC.

هناك احتمال آخر يبرز نوعا من حالة السباق، ويغير المصحح التوقيت بما يكفي للسماح لك بالابتعاد عنه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top