هل يمكنني معرفة القيمة المرجعة قبل العودة أثناء تصحيح الأخطاء في Visual Studio؟

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

سؤال

خذ الوظيفة التالية:

DataTable go() {
    return someTableAdapter.getSomeData();
}

عندما أقوم بتعيين نقطة توقف في هذه الوظيفة، هل هناك إمكانية لفحص القيمة التي تم إرجاعها؟ go() يقترن مباشرة بشبكة البيانات في .aspx صفحة.

الطريقة الوحيدة لفحص جدول البيانات الذي تم إرجاعه هي استخدام متغير مؤقت.ومع ذلك، هذا غير مريح بعض الشيء.أليس هناك طريقة أخرى؟

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

المحلول

ليس هذا ما أعلمه عن.لاحظ أنه إذا كنت يفعل أضف متغيرًا، سيتم إزالته بواسطة المترجم في إصدار الإصدار على أي حال...

تحديث: تمت إضافة هذه الوظيفة إلى VS2013.يمكنك رؤية قيم الإرجاع في نوافذ السيارات أو استخدامها $ReturnValue في نافذة المراقبة/الفورية.

لا يمكن رؤية القيمة إلا مباشرة بعد العودة من الدالة، وبالتالي فإن أسهل طريقة للوصول إليها هي وضع نقطة توقف عند استدعاء الدالة وتجاوز الاستدعاء (F10).


التحديث لـ VS2015:بوو!لسوء الحظ، لا يبدو أنه موجود في VS2015 (devenv v14)
تحديث لـ VS2017:لقد عاد.(ديفينف v15)

نصائح أخرى

ويمكن أن يتم ذلك في Visual Studio 2013 مع CLR 4.5.1 <لأ href = "http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2206747-function-return-value-in -debugger "يختلط =" نوفولو noreferrer "> وفقا لالعملاء الموقع التعليقات . لم يكن متوفرا في الإصدارات السابقة لC #.

و(البصرية ستوديو 2008 وفي وقت سابق بدعم لأنها VB.NET. لقد كان دائما متاح للمطورين C / C ++).

وأوافق على أن هذا هو الشيء المفيد جدا أن يكون لديك: ليس فقط رؤية قيمة الإرجاع للأسلوب قبل أن يخرج من ذلك، ولكن أيضا رؤية قيمة الإرجاع أساليب خطوت ما يزيد قليلا. I تنفيذه كجزء من تمديد التجاري إلى Visual Studio يسمى " OzCode ".

مع ذلك، يمكنك عرض القيم المرجعة طريقة الحق على محرر التعليمات البرمجية، كما نوع من HUD العرض:

لمزيد من المعلومات، يرجى الاطلاع على هذا الفيديو .

ووفقا لمايكروسوفت، لا توجد وسيلة لتنفيذ هذا صحيح مع التعليمات البرمجية المدارة. هذه هي مشكلة يكونوا على علم ونعمل على:

<اقتباس فقرة>   

وبالنسبة لأولئك الذين لديهم هناك تجربة تصحيح الأصلي C ++ أو رمز VB6، وكنت قد استخدمت ميزة حيث يتم توفير القيم عودة وظيفة لك في نافذة السيارات. للأسف، لا توجد هذه الوظيفة التعليمات البرمجية المدارة. في حين يمكنك كمحاولة للتغلب على هذه المشكلة عن طريق تعيين قيم الإرجاع إلى متغير محلي، وهذا ليست مريحة كما أنه يتطلب تعديل التعليمات البرمجية.   في التعليمات البرمجية المدارة، انها اصعب كثيرا لتحديد ما كنت قد صعدت قيمة الإرجاع وظيفة على مدى. أدركنا أننا لا يمكن أن تفعل الشيء الصحيح دائما هنا ولذا فإننا إزالة ميزة وليس تعطيك نتائج غير صحيحة في المصحح. ومع ذلك، ونحن نريد لتحقيق ذلك ظهر لك وCLR لدينا وفرق المصحح يبحثون في عدد من الحلول الممكنة لهذه المشكلة. للأسف هذا هو لن يكون جزءا من Visual Studio 11.

<وأ href = "https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net- كود "يختلط =" noreferrer "> https://connect.microsoft.com/VisualStudio/feedback/details/597933/add-a-return-pseudo-variable-to-the-visual-studio-debugger-for-net- كود

وفقًا للإجابة المقبولة حاليًا بواسطة Marc Gravell:

هذا تمت إضافة الوظيفة إلى Visual Studio 2013.يمكنك رؤية قيم الإرجاع في Windows AutOS أو استخدام $ returnvalue في النافذة الفورية

ذكرت تلك الإجابة أيضًا أن هذه الوظيفة لا تعمل في Visual Studio 2015.هذا ليس صحيحا (تماما).على افحص قيم الإرجاع لاستدعاءات الأسلوب هناك الملاحظة التالية:

يجب أن تكون أدوات تقييم التعبير القديمة قيد التشغيل قيمة الإرجاع $ ليتم الاعتراف بها (الأدوات / الخيارات / تصحيح الأخطاء / استخدم مقيمات تعبيرات C# وVB القديمة).خلاف ذلك، يمكنك استخدام $ReturnValue1.

لقد اختبرت ذلك في Visual Studio 2015 Enterprise:

  • مع إيقاف تشغيل مقيمي التعبير القديم: فقط $ReturnValue1 يعمل
  • مع تشغيل مقيمي التعبير القديم: كلاهما قيمة الإرجاع $ و $ReturnValue1 عمل

إذا كنت اذهب الى القائمة أدوات → <م> خيارات ، IntelliTrace، وتغيير الإعداد لجمع الأحداث واستدعاء المعلومات.

ويمكنك العودة إلى الحدث الدعوة السابق ( السيطرة + التحول + F11 ) وانظر قيمة مؤقتة عادت من استدعاء الأسلوب في الإطار السيارات كتابع اسم الأسلوب.

وهذا لن يظهر لك قيمة الإرجاع للأسلوب الذي أنت فيه. انها فقط يظهر لك قيمة الإرجاع من الماضي طريقة تسمى في الطريقة الحالية.

وهكذا، فإنه على ما يرام ل

DataTable go(){return someTableAdapter.getSomeData();}

وكما يظهر لك قيمة مقابل someTableAdapter.getSomeData().

ولكن ليس ل:

int go(){return 100 * 99;}

وقديم خدعة من الأيام. NET قبل: فتح نافذة السجلات والنظر في قيمة السجل EAX. هذا يحتوي على قيمة المرجعة من الدالة مشاركة يسمى.

الخطوة من طريقة الذهاب () باستخدام التحول-F11، ثم في "السيارات" إطار التصحيح وسوف تظهر قيمة الإرجاع من استدعاء الأسلوب الذي برزت قبالة كومة (في هذه الحالة، الذهاب () الطريقة التي هي ما تريد). هذا هو السلوك في Visual Studio 2005؛ أنا لم تستخدم البصرية ستوديو 2008 لذلك أنا لا أعرف إذا كان هذا يتصرف بنفس الطريقة في هذا الإصدار.

نعم هناك طريقة جميلة جداًأحد العوائق المهمة هو أنه سيتعين عليك الانتظار لمدة 5 أو ربما 6 سنوات.منذ أن رأيت أنك نشرت في نوفمبر 2008، أقترح عليك...

...ااايت.وها هو!من أجلك فقط، أصدرت MS الإصدار الأحدث فيجوال ستوديو 2013 حيث تكون ميزة افتراضية يمكن الوصول إليها من القوائم بينما تركض في وضع التصحيح (القائمة تصحيحشبابيكسيارات).

وهناك الكثير من الحلول، ولكن لا شيء يبدو مرضيا.

وعلى حد تعبير جون السكيت أدناه (تعليق على الجواب حذف الآن):

<اقتباس فقرة>   

ومع ذلك يبدو غير مريح بالنسبة لي -   خاصة إذا كنت لا تعرف أي   قيمة الإرجاع وأنت تسير في حاجة إلى   قبل بدء التصحيح. أنا في الحقيقه   لا أريد أن يكون لديك مؤقتا   متغير التبعثر حتى قانون بلدي كل   الوقت أي وقت مضى أعود anything.t

في نظرية، المصحح يمكن أن يكون له return-متغير. بعد كل شيء: انها مجرد متغير على المكدس:

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

وحتى النظر في هذا الطلب ميزة لبرنامج Visual Studio.

ومايكروسوفت البصرية C ++ تستخدم للقيام بذلك، ولكن البصرية ستوديو لا AFAIK ..: (

والطريقة الوحيدة التي اعرفها هي لوضع نقطة توقف على خط العودة وثم استدعاء <م> مراقبة سريعة نافذة وأدخل التعبير عاد:

someTableAdapter.getSomeData();

ولكن هذا يعمل فقط إذا لم دعوة تغيير حالة أي كائن (حيث سيكون هناك مكالمة ثانية إلى نفس الأسلوب عندما تستأنف تنفيذ).

وأردت أن يتوسع <لأ href = "https://stackoverflow.com/questions/268048/can-i-find-out-the-return-value-before-returning-while-debugging-in-visual -studi / 36081401 # 36081401 "> PascalK في الإجابة للحصول على الحصول على هذا العمل في Visual Studio 2015، بسبب وجود ميزة الخفية التي لم يتم توثيقها في <وأ href =" https://msdn.microsoft كوم / EN-US / مكتبة / dn323257.aspx "يختلط =" نوفولو noreferrer "> دراسة القيم عودة استدعاءات الأسلوب .

إذا كنت قد تداخل المكالمات وظيفة، و-المتغيرات الزائفة $ResultValueX يتم إنشاؤها تلقائيا، حيث تشير X لأمر استدعاء دالة. حتى إذا كان لديك مكالمة مثل Multiply(Five(), Six())، يتم إنشاء المتغيرات-الزائفة التالية:

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30

يمكنك أيضًا أن تطلب تقييم القيمة في النافذة المتوسطة أيضًا، إذا لم تقم بتعيين علامات أو متغيرات أخرى، ولكنها تُرجع شيئًا ما فقط.

واعتقد انه يمكن تحديد ذلك من خلال النظر في السجل RAX في نافذة السجلات (تصحيح / ويندوز / السجلات). بعد أن يخرج (SHIFT + F11) وظيفة، والتحقق من السجل RAX. أنا لا أعرف حقيقة، ولكن مرة واحدة على القمر هل يمكن الاختيار سجل (قبل أيام. NET) ونرى قيمة الإرجاع هناك. بل قد يكون مزيجا من RAX وRBX، وما إلى ذلك.

وفتح إطار التصحيح → سيارات يحصل لك قريبا. انها لن تظهر قيمة الإرجاع الفعلية، ولكن سوف تظهر ما تم تقييمها في بيان العودة.

نعم، عن طريق التحول إلى VB.NET. ؛ P (أنت لم نقول فقط "البصرية ستوديو"..)

لطالما أستطيع أن أتذكر (من Visual Basic من خلال كافة إصدارات VB.NET)، يمكنك ببساطة الاستعلام عن اسم وظيفة. أنه "وظائف" مثل متغير محلي وهذا ما أعلن ضمنيا في بداية وظيفة وقيمته الحالية كما يستخدم قيمة الإرجاع كلما مخارج وظيفة عن طريق الوسائل بيان عدم عودتهم (أي Exit Function أو مجرد السقوط من خلال) وبطبيعة الحال، عند استخدام العبارة العودة.

ومن المقرر أيضا أن التعبير البيان عودة. تماما مثل متغير محلي، يمكن أن تفقد قيمتها في أي لحظة التنفيذ داخل وظيفة (بما في ذلك بعد تنفيذ العبارة العودة). لم يكن هذا C # و ينبغي.

وهذا القليل ميزة VB.NET (بالإضافة إلى بيان Exit Function التي تمكنه - لايوجد آخر ميزة C # و يجب) مفيد جدا في شكل <وأ href = "https://en.wikipedia.org/ ويكي / Defensive_programming "يختلط =" نوفولو noreferrer "> البرمجة الدفاعية امارس حيث كنت دائما تهيئة اسم الدالة على القيمة فشل / الافتراضي كما هو البيان الأول. ثم، في أي لحظة الفشل (والذي يحدث عادة أكثر من ذلك بكثير في كثير من الأحيان من نقاط النجاح)، يمكن أن أدعو مجرد بيان Exit Function (أي دون الحاجة إلى تكرار / التعبير الافتراضي الفشل أو حتى اسم ثابت / متغير).

<وأ href = "https://stackoverflow.com/questions/268048/can-i-find-out-the-return-value-before-returning-while-debugging-in-visual-studi/268052# 268052 "> الجواب المقبول لا يعمل بشكل صحيح مع Visual Studio 2015، ولكن عن طريق وضع نقطة فاصل على السطر الأخير من طريقة والضغط على F10 ، فإنه سيتم وضع كل مظاهر قيمة الإرجاع في إطار السكان المحليين.

هل يمكن أن محاولة تحديد "someTableAdapter.getSomeData();"، انقر على الحق في ذلك، والذهاب ل<م> مراقبة سريعة .

وسحب وإسقاط التعبير عودة إلى إطار المراقبة.

وعلى سبيل المثال، في بيان

return someTableAdapter.getSomeData();

والسحب والإسقاط

someTableAdapter.getSomeData()

وفي إطار المراقبة، وسترى القيمة.

ويمكنك القيام بذلك عن أي تعبير.

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