2012-06-06 12 views
8

अक्सर मुझे विंडोज़ पर क्रैशिंग सी ++ प्रोग्राम डीबग करना पड़ता है जहां मैं क्रैश को पुन: उत्पन्न कर सकता हूं, लेकिन यह निर्धारित करना मुश्किल है कि कोड में निर्देशों के अनुक्रम में क्रैश का कारण बनता है (उदाहरण के लिए क्रैशिंग थ्रेड की एक और थ्रेड ओवरराइटिंग मेमोरी)। यहां तक ​​कि एक कॉल स्टैक भी उस मामले में मदद नहीं करता है। आम तौर पर मैं स्रोत कोड के अनुभागों पर टिप्पणी करके क्रैश कारण को कम करने का सहारा लेता हूं, लेकिन यह बहुत कठिन है।क्रैश से पहले तुरंत निष्पादित लाइनों या निर्देशों को लॉग या रीप्ले कैसे करें

क्या किसी को विंडोज के लिए एक उपकरण पता है जो किसी भी दुर्घटना से ठीक पहले सभी धागे में निष्पादित अंतिम कुछ स्रोत कोड लाइनों या मशीन कोड निर्देशों की रिपोर्ट या दोबारा चला सकता है? अर्थात। जीडीबी की रिवर्स डीबगिंग क्षमता या म्यूटेक बगट्रैपर जैसे कुछ (जो अब उपलब्ध नहीं है) की तरह कुछ। मैं एक रिलीज और स्थिर उपकरण की तलाश में हूं (मुझे सॉफ़्टवेयर वेरिफ़ी के 'बग वैलिडेटर' और हेक्सरे के आईडीए प्रो 6.3 ट्रेस रीप्लेयर के बारे में पता है, जिनमें से दोनों अभी भी बंद बीटा प्रोग्राम में हैं)।

जो मैंने पहले ही कोशिश की है वह WinDbg ट्रेस कमांड wt और ta @$ra था, लेकिन दोनों कमांडों का नुकसान यह है कि वे कुछ सेकंड के बाद स्वचालित रूप से बंद हो जाते हैं। मुझे ट्रेस आदेशों की आवश्यकता होती है जो क्रैश होने तक चलती हैं, और यह चल रहे प्रोग्राम के सभी धागे का पता लगाती है।

नोट: मैं कर रहा हूँ नहीं एक विशेष समस्या को ठीक करने, gflags, pageheap, मेमोरी सत्यापनकर्ता, शुद्ध, आदि मैं का पता लगाने या कम से पुनः चलाने के लिए जारी किया गया है और स्थिर उपकरण रहा हूँ की तरह डिजाइन एक डिबग उपकरण की तलाश में निर्देश स्तर।

+2

बस अपना कोड डीबगर में चलाएं और इसे आपको स्रोत डू में स्थान को इंगित करना चाहिए जो क्रैश को ट्रिगर करता है। –

+0

@ एएलएस: दुर्घटना का स्थान ढूंढना आम तौर पर कोई समस्या नहीं है; समस्या यह है कि * क्यों * दुर्घटना हुई है निर्धारित करने के लिए। उदाहरण के लिए, एक क्रैश हो सकता है क्योंकि किसी अन्य थ्रेड ने क्रैशिंग थ्रेड के मेमोरी क्षेत्रों को ओवरराइट कर दिया है (उदा। अस्थायी रूप से ढेर में या स्टैक क्षेत्र में लिखते हैं)। फिर, प्रोग्राम द्वारा निष्पादित अंतिम कुछ पंक्तियों या निर्देशों को देखना वास्तव में उपयोगी होगा ताकि यह निर्धारित किया जा सके कि किस धागे ने दूषित स्मृति क्षेत्र में कुछ लिखा है। मैंने यह स्पष्ट करने के लिए ऊपर दिए गए मेरे प्रश्न को अनुकूलित किया है। –

+0

संभावित डुप्लिकेट [पीछे की ओर डीबगिंग] (http://stackoverflow.com/questions/221806/debugging-backwards) – Ferruccio

उत्तर

4

मुझे एक समाधान मिला: वीएमवेयर वर्कस्टेशन और विजुअल स्टूडियो 2010 का उपयोग करके "रीप्ले डीबगिंग"।इसे स्थापित करने में काफी समय लगता है, लेकिन आपको विजुअल स्टूडियो सी ++ डीबगर के साथ पुरस्कृत किया जाता है जो समय पर पीछे की ओर डीबग कर सकता है। यहां एक वीडियो है जो दिखाता है कि रीप्ले डिबगिंग कैसे काम करता है: http://blogs.vmware.com/workstation/2010/01/replay-debugging-try-it-today.html

समाधान की कमी यह है कि वीएमवेयर ने हाल ही में नवीनतम वीएमवेयर संस्करणों में रीप्ले डीबगिंग को बंद कर दिया है। इसके अलावा, केवल कुछ प्रोसेसर प्रकार replaying का समर्थन करने लगते हैं। मुझे समर्थित प्रोसेसर की कोई व्यापक सूची नहीं मिली है; मैंने अपने तीन पीसी पर रीप्ले फीचर्स का परीक्षण किया: रीप्लेइंग कोर i7 200 पर काम नहीं किया; कोर 2 6700 और कोर 2 क्यू 6 9 50 पर रीप्लेइंग काम किया।

मुझे उम्मीद है कि वीएमवेयर पुनर्विचार और भावी वीएमवेयर वर्कस्टेशन संस्करणों में फिर से रीप्ले डीबगिंग पेश करेगा, क्योंकि यह वास्तव में डिबगिंग के लिए एक नया आयाम जोड़ता है।

आप में से जो लोग रुचि रखते हैं के लिए, यहाँ एक वर्णन है कि कैसे आप पुनरावृत्ति डिबगिंग के लिए एक वातावरण की स्थापना कर सकते हैं:

नीचे दिए गए विवरण में, "स्थानीय डिबगिंग" इसका मतलब है कि दृश्य स्टूडियो और VMware पर स्थापित कर रहे हैं एक ही पीसी "रिमोट डीबगिंग" का अर्थ है कि विभिन्न पीसी पर विजुअल स्टूडियो और वीएमवेयर स्थापित हैं।

  • होस्ट सिस्टम पर SP1 के साथ विजुअल स्टूडियो 2010 स्थापित करें।

  • सुनिश्चित करें कि विजुअल स्टूडियो को माइक्रोसॉफ्ट के प्रतीक सर्वर का उपयोग करने के लिए कॉन्फ़िगर किया गया है। ("उपकरण | विकल्प | डिबगिंग | प्रतीक" के तहत)।

  • होस्ट सिस्टम पर, "विंडोज़ के लिए डिबगिंग टूल्स" इंस्टॉल करें।

  • वीएमवेयर वर्कस्टेशन 7.1 स्थापित करें। (संस्करण 8.0 में अब रीप्ले डीबगिंग सुविधा नहीं है)। यह विजुअल स्टूडियो में प्लग-इन भी इंस्टॉल करेगा।

  • विंडोज एक्सपी एसपी 3 के साथ वीएमवेयर पर वर्चुअल मशीन (वीएम) स्थापित करें।

  • यदि परीक्षण के तहत आवेदन एक डीबग बिल्ड है, तो वीएम पर विजुअल स्टूडियो डीबग डीएलएल स्थापित करें। (निर्देशों के लिए http://msdn.microsoft.com/en-us/library/dd293568.aspx देखें कि इसे कैसे करें, लेकिन "रिलीज़" के बजाय "डीबग" कॉन्फ़िगरेशन का उपयोग करें)।

  • होस्ट के "विंडोज़ के लिए डीबगिंग टूल्स" निर्देशिका से "gflags.exe" को कॉपी करें, वीएम पर gflags.exe चलाएं, "सिस्टम रजिस्ट्री टैब" के अंतर्गत "कर्नेल स्टैक्स की पेजिंग अक्षम करें" का चयन करें और दबाएं ठीक। वीएम रीबूट करें।

  • वीएम के परीक्षण के तहत आवेदन की सभी EXE और DLL फ़ाइलों की प्रतिलिपि बनाएँ और सुनिश्चित करें कि आप एप्लिकेशन को प्रारंभ कर सकते हैं और समस्या को पुन: उत्पन्न कर सकते हैं।

  • वीएम को बंद करें और स्नैपशॉट बनाएं (संदर्भ मेनू आइटम के माध्यम से "वीएमवेयर वर्कस्टेशन में" स्नैपशॉट लें "के माध्यम से)।

  • (केवल रिमोट डिबगिंग :) दृश्य स्टूडियो पीसी पर निम्न आदेश प्रारंभ करें और एक मनमाना पासकोड दर्ज के लिए:

    C: \ Program Files \ VMware \ VMware कार्य केंद्र \ दृश्य स्टूडियो एकीकृत डीबगर \ dclProxy.exe होस्टनाम

    पीसी के नाम से होस्टनाम बदलें।

  • (केवल रिमोट डीबगिंग के लिए :) वीएम के लिए मैन्युअल रूप से रिकॉर्डिंग बनाएं। अर्थात। वीएम के ऑपरेटिंग सिस्टम में लॉग इन करें, रिकॉर्डिंग शुरू करें (संदर्भ मेनू "रिकॉर्ड" के माध्यम से), परीक्षण के तहत आवेदन चलाएं और समस्या को पुन: उत्पन्न करने के लिए आवश्यक क्रियाएं करें। फिर रिकॉर्डिंग को रोकें और सहेजें।

  • प्रारंभ दृश्य स्टूडियो और जाने के लिए "VMware | विकल्प | में वी एम खेलना डिबगिंग | सामान्य", और सेट निम्न मान:

    • "स्थानीय या रिमोट" करने के लिए स्थानीय के लिए "स्थानीय" सेट किया जाना चाहिए रिमोट डीबगिंग के लिए डीबगिंग या "रिमोट" करने के लिए।
    • "वर्चुअल मशीन" को VM की .vmx फ़ाइल के पथ पर सेट किया जाना चाहिए।
    • "रिमोट माचियोन पासकोड" को ऊपर दिए गए पासकोड के रूप में सेट किया जाना चाहिए (केवल रिमोट डीबगिंग के लिए)।
    • "रीप्ले करने के लिए रिकॉर्डिंग" को रिकॉर्डिंग नाम पर सेट किया जाना चाहिए जिसे आपने पहले VMware के साथ बनाया था।
    • "मेजबान निष्पादन योग्य खोज पथ" को उस निर्देशिका में सेट किया जाना चाहिए जिसमें आप डीएलएल को सहेजते हैं जो परीक्षण के तहत आवेदन द्वारा आवश्यक हैं और दृश्य स्टूडियो द्वारा सही स्टैक निशान प्रदर्शित करने के लिए आवश्यक हैं।

    "लागू करें" दबाएं।

  • जाओ करने के लिए "VMware | विकल्प | वीएम में खेलना डिबगिंग | पूर्व रिकार्ड घटना", और निम्न मान सेट करें:

    • "रिकॉर्डिंग के लिए बेस स्नैपशॉट": पूर्व में बनाए गए स्नैपशॉट का नाम है।

    "ठीक" दबाएं।

  • (स्थानीय डिबगिंग के लिए :) विजुअल स्टूडियो में, "वीएमवेयर | रीप्ले के लिए रिकॉर्डिंग बनाएं" का चयन करें; यह वीएम को पुनरारंभ करता है। वीएम में लॉग इन करें, परीक्षण के तहत आवेदन चलाएं और समस्या को पुन: पेश करने के लिए आवश्यक कार्रवाई करें। फिर रिकॉर्डिंग को रोकें और सहेजें।

  • "वीएमवेयर | रीप्ले डिबगिंग प्रारंभ करें" का चयन करें। वीएमवेयर अब स्वचालित रूप से वीएम और एप्लिकेशन को परीक्षण के तहत पुनरारंभ करता है और रिकॉर्ड किए गए कार्यों को दोहराता है। एप्लिकेशन क्रैश होने तक प्रतीक्षा करें; विजुअल स्टूडियो डीबगर स्वचालित रूप से सक्रिय हो जाता है।

  • विजुअल स्टूडियो डीबगर में, उस स्थान पर ब्रेकपॉइंट सेट करें जहां आपको लगता है कि एप्लिकेशन क्रैश से पहले रहा है। फिर, "वीएमवेयर | रिवर्स जारी रखें" का चयन करें। डीबगर अब ब्रेकपॉइंट पर पीछे चलाता है। इस ऑपरेशन में कुछ समय लग सकता है क्योंकि वीएम को फिर से शुरू किया जाएगा और आपके ब्रेकपॉइंट तक पहुंचने तक फिर से चलाया जाएगा। (जब आप परिदृश्य रिकॉर्ड करते हैं तो क्रैश होने से कुछ सेकंड पहले स्नैपशॉट जोड़कर आप इस ऑपरेशन को तेज कर सकते हैं। आप रीप्ले डीबगिंग के दौरान अतिरिक्त स्नैपशॉट जोड़ सकते हैं।)

  • एक बार वीएमवेयर ने आपके ब्रेकपॉइंट पर वीएम को फिर से चलाया है, तो आप अपने ब्रेकपॉइंट से आगे बढ़ने के लिए "चरण ओवर" और "चरण में" का उपयोग कर सकते हैं, यानी आप घटनाओं के रिकॉर्ड किए गए इतिहास को फिर से चला सकते हैं, जब तक आप उस बिंदु तक नहीं पहुंच जाते जहां आप अपना आवेदन क्रैश क्यों कर सकते हैं।

अधिक जानकारी: http://www.replaydebugging.com/

+0

का उपयोग नहीं किया है, भले ही @ स्टेफ़न (जो बक्षीस अर्जित करता है) का उत्तर भी सही है, मैं अपना जवाब स्वीकार कर रहा हूं, क्योंकि वीएमवेयर समाधान है बीएमसी ऐपसाइट की तुलना में बहुत सस्ता है, और शायद अभी भी कुछ सालों तक काम करेगा (जब तक वीएमवेयर 7.1 की प्रोसेसर आवश्यकताएं पूरी नहीं हो सकतीं)। –

9

यदि आप another thread overwriting memory of the crashing thread के साथ सामना करते हैं तो gflags (GFlags and PageHeap) का उपयोग करना उपयोगी होता है। आपको कुछ पंक्तियों को बताने के बजाय जो एक दुर्घटना से पहले निष्पादित किए गए हैं, यह आपको बिल्कुल वही जगह बताएगा जहां आपके एल्गोरिदम ने स्मृति के सही आवंटित ब्लॉक को ओवरराइट किया है।

आप पहले की जांच इस प्रकार सक्रिय करें:

gflags /p /enable your_app.exe /full या
gflags /p /enable your_app.exe /full /backwards

जांचें कि आपने उसे
gflags /p

रन आप आवेदन को सक्रिय किया है और डंप फ़ाइलों को इकट्ठा

और उसके बाद gflags के साथ जांच अक्षम करें:

gflags /p /disable your_app.exe


अद्यतन 1

It does not immediately detect problems like *p = 0; where p is an invalid pointer
कम से कम कुछ समस्याओं का पता चला।
उदाहरण के लिए:

#include <stdio.h> 
int main(int argc, char *argv[]) 
{ 
    int *p = new int; 
    printf("1) p=%p\n",p); 
    *p = 1; 
    delete p; 
    printf("2) p=%p\n",p); 
    *p = 2; 
    printf("Done\n"); 
    return 0;  
} 

जब मैं gflags के साथ चलाने के सक्षम मैं एक डंप फ़ाइल मिलता है और समस्या को सही ढंग से पहचान की है:

STACK_TEXT: 
0018ff44 00401215 00000001 03e5dfb8 03dfdf48 mem_alloc_3!main+0x5b [c:\src\tests\test.cpp\mem_alloc\mem_alloc\mem_alloc.3.cpp @ 11] 
0018ff88 75f8339a 7efde000 0018ffd4 77bb9ef2 mem_alloc_3!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 586] 
0018ff94 77bb9ef2 7efde000 2558d82c 00000000 kernel32!BaseThreadInitThunk+0xe 
0018ffd4 77bb9ec5 004013bc 7efde000 00000000 ntdll!__RtlUserThreadStart+0x70 
0018ffec 00000000 004013bc 7efde000 00000000 ntdll!_RtlUserThreadStart+0x1b 


STACK_COMMAND: ~0s; .ecxr ; kb 

FAULTING_SOURCE_CODE: 
    7: printf("1) p=%p\n",p); 
    8: *p = 1; 
    9: delete p; 
    10: printf("2) p=%p\n",p); 
> 11: *p = 2; 
    12: printf("Done\n"); 
    13: return 0; 
    14: 
    15: } 


अद्यतन 2

एक और उदाहरण से @fmunkert:

#include <stdio.h> 

int main() 
{ 

     int *p = new int; 
     printf("1) p=%p\n",p); 
     *p = 1; 
     p++; 
     printf("2) p=%p\n",p); 
     *p = 2; // <==== Illegal memory access 
     printf("Done\n"); 
     return 0; 

} 

gflags /p /enable mem_alloc.3.exe /full /unaligned

STACK_TEXT: 
0018ff44 00401205 00000001 0505ffbe 04ffdf44 mem_alloc_3!main+0x52 [c:\src\tests\test.cpp\mem_alloc\mem_alloc\mem_alloc.3.cpp @ 12] 
0018ff88 75f8339a 7efde000 0018ffd4 77bb9ef2 mem_alloc_3!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 586] 
0018ff94 77bb9ef2 7efde000 2577c47c 00000000 kernel32!BaseThreadInitThunk+0xe 
0018ffd4 77bb9ec5 004013ac 7efde000 00000000 ntdll!__RtlUserThreadStart+0x70 
0018ffec 00000000 004013ac 7efde000 00000000 ntdll!_RtlUserThreadStart+0x1b 


STACK_COMMAND: ~0s; .ecxr ; kb 

FAULTING_SOURCE_CODE: 
    8:   printf("1) p=%p\n",p); 
    9:   *p = 1; 
    10:   p++; 
    11:   printf("2) p=%p\n",p); 
> 12:   *p = 2; // <==== Illegal memory access 
    13:   printf("Done\n"); 
    14:   return 0; 
    15: 
    16: } 

Unfortunatelly /असंरेखित विकल्प तथ्य यह है कि एक कार्यक्रम के ठीक से काम नहीं करेगा में परिणाम हो सकता है (How to use Pageheap.exe):

कुछ कार्यक्रमों में बनाने के बारे में 8-बाइट संरेखण मान्यताओं और वे को/unaligned पैरामीटर के साथ सही ढंग से काम करना बंद कर देते हैं। माइक्रोसॉफ्ट इंटरनेट एक्सप्लोरर एक ऐसा कार्यक्रम है।

+0

gflags तंत्र केवल हर समय ढेर की जांच करता है। यह तुरंत * * p = 0; 'जैसी समस्याओं का पता नहीं लगाता है, जहां पी एक अमान्य सूचक है। और gflags का एक और अधिक महत्वपूर्ण दोष यह है कि यह कई झूठी सकारात्मक रिपोर्ट भी करता है और कुछ मॉड्यूल या कॉल स्टैक को बदलने के लिए gflags को बताने का कोई तरीका नहीं है। –

+0

'कुछ मॉड्यूल के लिए gflags को बताने का कोई तरीका नहीं है' - सहायता देखें: 'gflags/p /? '->'/dlls DLL ...लक्ष्य dlls.' –

+0

curioisy से बाहर पृष्ठ ढेर आवंटन। कृपया, मुझे कुछ सी ++ कोड दिखाएं जहां gflags झूठी सकारात्मक रिपोर्ट करता है। –

2

मैं WinDbg देते हैं जब कार्यक्रम चल रहा है और जब यह एक दुर्घटना या अपवाद पर debugbreaks कोई मिनीडम्प कार्य करें:

.dump /ma c:\mem.dmp // c:\mem.dmp could be any other location you desire 

मैं, अपने अनुप्रयोग के लिए gflags सक्षम होगा या तो भीतर की कमांड लाइन से WinDbg:

!gflag +ust 

इस ध्वज को हटाने के बाद याद रखें !!

!analyze -v 

इससे आपको पता चल सकता है कि यह दुर्घटना का कारण बना सोचता है, आप सभी धागे की कॉल के ढेर डंप कर सकते हैं::

~* kb 

और अगर

तो फिर तुम एक स्वचालित exepction विश्लेषण चला सकते हैं कुछ भी संदिग्ध देखें, आप थ्रेड स्विच कर सकते हैं और आगे निरीक्षण कर सकते हैं:

~x s 

आप इंस्पेक कर सकते हैं http: //blogs.msdn.com/b/slavao/archive/2005/01/

.ecxr 

वहाँ कैसे एक पकड़ने ब्लॉक से कॉल स्टैक ठीक करने के लिए पर एक अच्छा लिंक है: अपवाद संदर्भ रिकॉर्ड टी 30/363428.aspx और यह भी: http://blogs.msdn.com/b/jmstall/archive/2005/01/18/355697.aspx

मुख्य बात यह है कि विंडबग संलग्न होने के साथ आप सभी धागे और कॉल स्टैक की स्थिति का निरीक्षण करने में सक्षम होना चाहिए, आप दृश्य स्टूडियो में मिनीडम्प भी खोल सकते हैं: http://msdn.microsoft.com/en-us/library/windows/desktop/ee416349%28v=vs.85%29.aspx#Analysis_of_a_minidump यदि आप नेविगेटिंग के लिए विजुअल स्टूडियो पसंद करते हैं, तो आप कोड को नेविगेट करने के लिए विश्लेषण और दृश्य स्टूडियो के लिए अपने टूल्स का उपयोग करने के लिए विंडबग में एक ही डंप खोल सकते हैं। उम्मीद है की यह मदद करेगा।

+0

व्यापक उत्तर के लिए धन्यवाद, लेकिन कार्यक्रम की वर्तमान स्थिति का विश्लेषण समस्या नहीं है; मैं क्रैशिंग थ्रेड के कॉल स्टैक को भी जानता हूं। मुझे जो चाहिए वह निष्पादन इतिहास को जानना है (प्रोग्राम में हर जगह ट्रेस स्टेटमेंट जोड़ने के बिना)। –

+0

जो आप पूछ रहे हैं वह गतिविधि को लॉग करने का कोई तरीका है? आप अपने मॉड्यूल या अन्य मॉड्यूल पर ब्रेकपॉइंट सेट कर सकते हैं और 'wt' कमांड निष्पादित कर सकते हैं:' बीपी myDLL! MyClass: someFunc() "wt; g;" 'आप myDLL को प्रारंभ पते के साथ बदल सकते हैं और इसी तरह' wt ' ', और आउटपुट को लॉगफाइल पर लिखें: '.logopen c: \ myLog.txt' लेकिन यह जानने के लिए कि किसी त्रुटि के दौरान यह जानने के लिए कुछ प्रकार की सटीक आवश्यकता होगी, आप Logexts.dll का उपयोग करके कुछ लॉगिंग इंजेक्ट कर सकते हैं लेकिन यह इसे एमएस तक सीमित करता है एपीआई कॉल – EdChum

+0

'wt' केवल वर्तमान धागे को लॉग करता है; मैं सभी धागे लॉग करने के लिए एक रास्ता तलाश रहा हूँ। इसके अलावा, मैंने ध्यान दिया है कि 'wt' कभी-कभी किसी स्पष्ट कारण के लिए लॉगिंग बंद कर देता है। –

1

बॉक्स से बाहर इस कार्यक्षमता की पेशकश GDB नहीं है?

यह थोड़ी देर के बाद से मैंने इसका इस्तेमाल किया है, लेकिन मुझे याद है कि यह एक प्रोग्राम चला सकता है जब तक कि यह दुर्घटनाग्रस्त न हो और फिर डीबगर में आपके लिए चरणों को फिर से चलाएं।

इसके अलावा, यह आपके स्वयं के लॉगिंग एप्लिकेशन को सेट करने के लिए सीधा होगा जो आपके द्वारा चुने गए किसी भी डेटा को आउटपुट कर सकता है और एक्सई के लिए कमांड लाइन परम द्वारा सक्रिय किया जा सकता है?

आप अपने द्वारा किए गए क्रैश से निपटने के लिए या बस मूलभूत बातें को कवर करने के लिए इसे सेट अप कर सकते हैं और उसके बाद इसे बढ़ा सकते हैं जैसे कि आप निश्चित बग या नई कार्यक्षमता जोड़ते हैं। लाभ यह होगा कि आप वास्तव में उस डेटा को कैप्चर करने में सक्षम होंगे जो आपको उपयोगी लगता है और शोर के साथ घूमने से बचने के लिए लॉगिंग के स्तर भी निर्दिष्ट कर सकता है?

+0

मैं विंडोज के लिए एक समाधान की तलाश में हूं (मेरे मूल प्रश्न पर टैग देखें)। जीडीबी केवल इस कार्यक्षमता को लिनक्स लक्ष्यों के लिए प्रदान करता है। प्रभावित एप्लिकेशन में लॉगिंग जोड़ना कोई समाधान नहीं है क्योंकि मुझे तीसरे पक्ष के पुस्तकालयों में निष्पादित निर्देशों को भी जानना चाहिए। –

+0

आह, मुझे एहसास नहीं हुआ कि जीडीबी विंडोज का समर्थन नहीं करता था। तीसरे पक्ष के अतिरिक्त भी आपके खुद के लॉगर लिखने में एक छेद उड़ाता है। हम्म - माफ करना - इस समय आपके पास कोई भी उपयोग नहीं है, शुभकामनाएं। – Stefan

1

बीएमसी की ऐपसाइट का उपयोग करने के बारे में कैसे?

हमने इसे पिछली कंपनी में इस्तेमाल किया (माफ करना, मुझे नाम याद रखने में थोड़ी देर लग गई), इसका इस्तेमाल क्रैश आदि के लिए किया गया था। आईस्ट्रो आप इसे चलाते थे और फिर अपने सॉफ़्टवेयर को चलाते थे और यह सबकुछ दर्ज किया गया था एक लॉग फ़ाइल जिसे आप बाद में देख सकते हैं।

यह निश्चित रूप से विंडोज पर काम करता है जैसा मैंने इसे उपयोग किया था।

यह वही हो सकता है जो आप खोज रहे हैं?

+0

ऐसा लगता है जैसे ऐपसाइट एक बंद म्यूक बगट्रैपर (बाद में पहचान द्वारा अधिग्रहित) के समान है; इसलिए आपका जवाब पहला ऐसा है जो वास्तव में मेरे प्रश्न का उत्तर देता है। दुर्भाग्यवश, मुझे डर है कि बीएमसी द्वारा अनुरोधित 150,000 डॉलर की न्यूनतम परियोजना कीमत मेरे बजट से बाहर है। –

-1

पूरी तरह से सुनिश्चित नहीं है कि यह वही है जो आप चाहते हैं, लेकिन 'यू' मौजूदा थ्रेड पर वर्तमान आईपी रजिस्टर से अंतिम निर्देशों को अलग कर देगा। इससे आपको अंतिम निर्देश दिखाए जाएंगे, और आप आम तौर पर यह पता लगा सकते हैं कि अलग-अलग रजिस्टरों के लिए कौन से मूल्य अलग-अलग कोड के माध्यम से आपके रास्ते का समर्थन कर रहे थे। यह ज्यादातर समय धीमी और कठिन प्रक्रिया है, लेकिन यह आपको लगभग 100% सटीकता (कुछ अजीब हार्डवेयर समस्याओं को छोड़कर, या वास्तव में विषम कोड समस्याओं को छोड़कर) देता है जो अभी हुआ। मैंने अतीत में इस विधि का उपयोग यह पता लगाने के लिए किया है कि मेरे पास स्रोत कोड नहीं होने पर कुछ चीजें क्यों निकल गईं।

यदि आप विंडबैग सहायता फ़ाइल की जांच करते हैं तो आपको इसके बारे में अधिक जानकारी मिल जाएगी।

+0

-1। यह केवल उस कोड में काम करेगा जिसमें सशर्त शाखाएं नहीं हैं और इससे कूदने के लिए पते की गणना नहीं की जाती है। व्यावहारिक रूप से प्रोसेसर के लिए किसी दिए गए निर्देश तक पहुंचने के लिए आमतौर पर कई तरीके होते हैं और जिस पथ का कारण बनता है वह अव्यवहारिक रूप से कठिन या कठिन होता है। विभिन्न दुष्प्रभावों के आधार पर इसे पुनर्निर्माण करने की बजाय पथ को जानना बेहद मदद करता है। और यही पूछा गया था। –

संबंधित मुद्दे