c++ - Mingw संकलित निष्पादनयोग्य के लिए minidumps और GDB का उपयोग कर दुर्घटना का विश्लेषण करें?




windows (2)

क्या आप अपने पीआईडी ​​को खोजने के बाद क्रैशिंग प्रक्रिया से संलग्न कर सकते हैं? मैं अपने ऐप के लिए ऐसा कर सकता था।

(gdb) attach 1337
Attaching to process 1337
...
(gdb)

http://bengreen.eu/fancyhtml/quickreference/gdbusageinwindows.html

मैं अपनी परियोजना को संकलित करने के लिए Cmake + mingw का उपयोग करता हूं। कुछ अज्ञात क्षण के बाद से मेरा कार्यक्रम स्टार्टअप पर क्रैश करना शुरू हुआ और मुझे पता चला कि मेरे दुर्घटनाग्रस्त आवेदन के लिए खिड़कियां बनाने के लिए मिडियाडम्प कैसे बनें। मैं जीडीबी का उपयोग सीधे अपने आवेदन को डिबग करने के लिए करूँगा, लेकिन जब मैं जीडीबी का उपयोग करता हूं तो यह प्रोग्राम क्रैश नहीं करता। Google ब्रेकपैड में मिनीडों को क्रासप्स में कनवर्ट करने के लिए टूल शामिल है, इसलिए मैंने Google ब्रेकपैड को संकलित करने का प्रयास किया लेकिन ऐसा लगता है कि ब्रेकपैड विंडो समाधान नहीं है मैं समाधान के लिए खोज रहा हूं कि कैसे minidump का निरीक्षण किया जाए और मेरे प्रोग्राम को शुरू में क्यों क्रैश हो? आप इसे कैसे करते हो?


आपको मिनीडम्प का विश्लेषण करने की आवश्यकता नहीं है इसके बजाय आप अपने डीबगर को पोस्ट-मॉर्टम डीबगर के रूप में सेट कर सकते हैं। मैंने इंटरनेट पर "खिड़कियों को पोस्टरॉर्टेम डिबगर जीडीबी के साथ बदल दिया" के लिए खोज की है देखो, डॉ। मिंगव है: https://github.com/jrfonseca/drmingw यह उनकी साइट से है:

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

मैंने एक साधारण सी ++ परीक्षा लिखी है:

int f()
{
  int *ptr = 0;
  *ptr = *ptr +1;
  return  *ptr;
}

int main()
{
  f();
  return 0;
}

इसे बनाओ:

g++ -g main.cpp

यह मेरा कार्यक्रम क्रैश होने पर ड्रमिंगव का उत्पादन है और आपकी डिस्क पर स्रोत फाइलें हैं I जैसा कि आप देख सकते हैं कि समस्या के साथ एक रेखा का पता लगाने में काफी आसान है:

.exe caused an Access Violation at location 0040139C in module a.exe Reading from location 00000000.

Registers:
eax=00000000 ebx=7ffdb000 ecx=00000001 edx=77c51ae8 esi=01cedca2 edi=2eafc26a
eip=0040139c esp=0022ff38 ebp=0022ff48 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202

AddrPC   Params
0040139C 0000001D 7FFDB000 0022FFA0 a.exe!f()  [D:\src-c++\test.crasj/main.cpp @ 4]
    ...
    {
      int *ptr = 0;
>     *ptr = *ptr +1;
      return  *ptr;
    }
    ...

004013BD 00000001 003D3DC0 003D2C78 a.exe!main  [D:\src-c++\test.crasj/main.cpp @ 11]
    ...
    {
      f();
>     return 0;
    }
    ...

004010B9 00000001 A9FF6D08 7C90E64E a.exe!__mingw_CRTStartup  [C:\MinGW\msys\1.0\src\mingwrt/../mingw/crt1.c @ 244]
00401284 2EAFC26A 01CEDCA2 7FFDB000 a.exe!WinMainCRTStartup  [C:\MinGW\msys\1.0\src\mingwrt/../mingw/crt1.c @ 274]
7C816D4F 0040126C 00000000 78746341 kernel32.dll!RegisterWaitForInputIdle

यदि परीक्षण "-g" के साथ निर्मित होता है लेकिन कोई स्रोत फाइल उपलब्ध नहीं होती है, तो डॉ। मिंगव का उत्पादन इस तरह दिखता है और यह भी स्पष्ट है कि किस प्रोग्राम पर आपका प्रोग्राम क्रैश हुआ है:

a.exe caused an Access Violation at location 0040139C in module a.exe Reading from location 00000000.

Registers:
eax=00000000 ebx=7ffd7000 ecx=00000001 edx=77c51ae8 esi=01cedca8 edi=ef612c64
eip=0040139c esp=0022ff38 ebp=0022ff48 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202

AddrPC   Params
0040139C 0000001D 7FFD7000 0022FFA0 a.exe!f()  [D:\src-c++\test.crasj/main.cpp @ 4]
004013BD 00000001 003D3D98 003D2C50 a.exe!main  [D:\src-c++\test.crasj/main.cpp @ 11]
004010B9 00000001 F7114D08 7C90E64E a.exe!__mingw_CRTStartup  [C:\MinGW\msys\1.0\src\mingwrt/../mingw/crt1.c @ 244]
00401284 EF612C64 01CEDCA8 7FFD7000 a.exe!WinMainCRTStartup  [C:\MinGW\msys\1.0\src\mingwrt/../mingw/crt1.c @ 274]
7C816D4F 0040126C 00000000 78746341 kernel32.dll!RegisterWaitForInputIdle

अगर परीक्षण "-g" के बिना निर्मित होता है तो डॉ। मिंगव का उत्पादन इस तरह दिखता है:

a.exe caused an Access Violation at location 0040139C in module a.exe Reading from location 00000000.

Registers:
eax=00000000 ebx=7ffdf000 ecx=00000001 edx=77c51ae8 esi=01cedca4 edi=79abd658
eip=0040139c esp=0022ff38 ebp=0022ff48 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202

AddrPC   Params
0040139C 0000001D 7FFDF000 0022FFA0 a.exe
004013BD 00000001 003D3DC0 003D2C78 a.exe
004010B9 00000001 A9D73D08 7C90E64E a.exe!__mingw_CRTStartup  [C:\MinGW\msys\1.0\src\mingwrt/../mingw/crt1.c @ 244]
00401284 79ABD658 01CEDCA4 7FFDF000 a.exe!WinMainCRTStartup  [C:\MinGW\msys\1.0\src\mingwrt/../mingw/crt1.c @ 274]
7C816D4F 0040126C 00000000 78746341 kernel32.dll!RegisterWaitForInputIdle 






minidump