GDB ट्यूटोरियल
जीडीबी के साथ शुरुआत करना
खोज…
टिप्पणियों
GDB (GNU प्रोजेक्ट डिबगर) एक कमांड लाइन बेस डीबगर है जो रनिंग और कोर्ड प्रोग्राम का विश्लेषण करने में अच्छा है। उपयोगकर्ता पुस्तिका के अनुसार GDB C, C ++, D, Go, Objective-C, Fortran, Java, OpenCL C, पास्कल, रस्ट, असेंबली, मोडुला -2 और Ada को सपोर्ट करता है।
GDB में अधिकांश डीबगर के रूप में एक ही सुविधा सेट है, लेकिन जो मैंने इसमें उपयोग किया है, उससे अलग है, यह सभी GUI तत्वों पर क्लिक करने के बजाय टाइपिंग कमांड पर आधारित है। इनमें से कुछ विशेषताएं शामिल हैं:
- ब्रेक पॉइंट सेट करना
- चरों का मान छापना।
- चीजों का परीक्षण करने के लिए चर का मान सेट करना।
- ढेर देखना
GDB क्या है?
GDB, GNU डीबगर के लिए छोटा, UNIX सिस्टम के लिए C और C ++ प्रोग्राम डिबग करने के लिए सबसे लोकप्रिय डीबगर है। GNU डीबगर, जिसे gdb भी कहा जाता है, UNIX सिस्टम के लिए C और C ++ प्रोग्राम को डिबग करने के लिए सबसे लोकप्रिय डिबगर है।
GNU डिबगर आपको निम्नलिखित के बारे में जानकारी प्राप्त करने में मदद करता है:
यदि एक कोर डंप हुआ, तो कार्यक्रम किस कथन या अभिव्यक्ति पर दुर्घटनाग्रस्त हुआ?
यदि किसी फ़ंक्शन को निष्पादित करते समय कोई त्रुटि होती है, तो किस लाइन की
कार्यक्रम में उस फ़ंक्शन को कॉल शामिल है, और क्या हैं
मापदंडों?कार्यक्रम के निष्पादन के दौरान एक विशेष बिंदु पर कार्यक्रम चर के मूल्य क्या हैं?
एक कार्यक्रम में एक विशेष अभिव्यक्ति का परिणाम क्या है?
जीडीबी शुरू करना
टर्मिनल में GDB शुरू करने के लिए,
gdb <executable name>
मुख्य नाम के एक कार्यक्रम के साथ उपरोक्त उदाहरण के लिए, कमांड बन जाता है
gdb main
ब्रेकप्वाइंट सेट करना
आप शायद चाहते हैं कि आप किसी बिंदु पर रुकने का कार्यक्रम बनाएं ताकि आप अपने कार्यक्रम की स्थिति की समीक्षा कर सकें। जिस लाइन पर आप प्रोग्राम को अस्थायी रूप से बंद करना चाहते हैं, उसे ब्रेकपॉइंट कहा जाता है।
break <source code line number>
अपना कार्यक्रम चला रहे हैं
अपना प्रोग्राम चलाने के लिए, जैसा आपने अनुमान लगाया था, कमांड
run
एक कोर खोलना
gdb -c coreFile pathToExecutable
एक कोर फ़ाइल के साथ काम करना
यह वास्तव में बुरा कार्यक्रम बनाया गया
#include <stdio.h>
#include <ctype.h>
// forward declarations
void bad_function()
{
int *test = 5;
free(test);
}
int main(int argc, char *argv[])
{
bad_function();
return 0;
}
gcc -g ex1.c
./a.out //or whatever gcc creates
Segmentation fault (core dumped)
gdb -c core a.out
Core was generated by `./a.out'.
संकेत SIGSEGV, सेगमेंटेशन दोष के साथ कार्यक्रम समाप्त हुआ। # 0 __GI___libc_free (mem = 0x5) Malloc.c पर: 2929 2929 malloc.c: ऐसी कोई फ़ाइल या निर्देशिका नहीं।
(gdb) where
# 1 __GI___libc_free (मेम = 0x5) Malloc.c पर: 2929 # 1 0x0000000000400549 bad_function () में ex1.c: 12 # 2 0x0000000000400564 मुख्य (argc = 1), argv = 0x7fffb825bd68_db6868
चूंकि मैंने -g के साथ संकलित किया है, आप उस कॉलिंग को देख सकते हैं जहां मुझे बताता है कि यह bad_function () की लाइन 12 पर कोड पसंद नहीं आया था
फिर मैं उस परीक्षण चर की जांच कर सकता हूं जिसे मैंने मुक्त करने की कोशिश की थी
(gdb) up
# 1 0x0000000000400549 bad_function में () ex1.c पर: 12 12 मुफ्त (परीक्षण);
(gdb) print test
$ 1 = (इंट *) 0x5
(gdb) print *test
0x5 पते पर मेमोरी तक नहीं पहुंच सकते
इस मामले में बग बहुत स्पष्ट है मैंने एक पॉइंटर को मुक्त करने की कोशिश की जो कि केवल 5 पते को सौंपा गया था जो कि मॉलोक द्वारा नहीं बनाया गया था, इसलिए यह पता नहीं है कि इसके साथ क्या करना है।