2010-08-05 18 views
6

के लिए सिग्नल हैंडलर के साथ प्रोग्राम डीबग कैसे करें मैं एक एप्लिकेशन के लिए एक प्लगइन लिख रहा हूं, कभी-कभी एक SIGSEGV फेंक दिया जाएगा। हालांकि, आवेदन सिग्सेगवी सिग्नल पकड़ता है। दूसरे शब्दों में, प्लगइन एक गतिशील पुस्तकालय है। त्रुटि मेरी प्लगइन और गतिशील पुस्तकालय में होती है। लेकिन applcation sSIGSEGV संभालती है और सामान्य रूप से बाहर निकलती है। तो, मेरे लिए डीबग करना और सभी ढेर फ्रेमों का बैकट्रैक प्राप्त करना काफी मुश्किल है। कोई उपाय?SIGSEGV

वर्तमान में मैं डीडीयूजी उपकरण के रूप में जीडीबी का उपयोग कर रहा हूं।

उत्तर

6

GDB होगा पकड़ SIGSEGV से पहले आवेदन करता है।

लॉगन के उत्तर पर टिप्पणी में आपने जो वर्णन किया है, उसे कोई समझ नहीं आता है।

मुझे संदेह है कि वास्तव में क्या हो रहा है यह है कि एप्लिकेशन एक नई प्रक्रिया बनाता है, और उस अन्य प्रक्रिया में केवल SIGSEGV प्राप्त होता है, न कि आपने जीडीबी को संलग्न किया है।

निम्न कमांड उपयोगी हो सकता है अगर मेरा अनुमान सही है:

(gdb) catch fork 
(gdb) catch vfork 
(gdb) set follow-fork-mode child 

तुम भी संपादित करें और अपने प्रश्न का विस्तार करना चाहते हो सकता है:

  • आप कैसे जानते हैं कि एक SIGSEGV है शुरुआत के लिए?
  • GDB के साथ आपकी बातचीत का लॉग पोस्ट करना भी उपयोगी साबित हो सकता है।
+0

आप सही हैं। निश्चित रूप से, मुझे बाल प्रक्रिया 'त्रुटि पकड़ा जाना चाहिए। धन्यवाद। – Blad

+0

मैंने आपके सुझाव के अनुसार कोशिश की, लेकिन एक और समस्या ऐप को निरस्त कर देती है: "खोल-इनिट: वर्तमान निर्देशिका को पुनर्प्राप्त करने में त्रुटि: getcwd: मूल निर्देशिका तक नहीं पहुंच सकता: ऐसी कोई फ़ाइल या निर्देशिका नहीं है"। कोई उपाय? – Blad

4

यदि प्रोग्राम एसआईजीएसईजीवी का पता लगाता है, तो भी जीडीबी को इसे पहले प्राप्त करना चाहिए और आपको कार्यक्रम को डीबग करने का अवसर देना चाहिए। क्या आपने

handle SIGSEGV nostop 

जीडीबी में कुछ किया है? यदि ऐसा है तो ऐसा क्यों हो सकता है कि यह रोक नहीं रहा है।

क्या आप वाकई एक segfault वास्तव में हो रहा है? क्या आप इस व्यवहार को किसी अन्य प्रोग्राम के साथ डुप्लिकेट कर सकते हैं, या जानबूझकर सेगमेंटेशन उल्लंघन का कारण बन सकते हैं?

उदाहरण के लिए:

$ cat sig.c 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

void handle(int n) 
{ 
     puts("Bail"); 
     exit(1); 
} 

int main() 
{ 
     signal(SIGSEGV, handle); 
     int *pi = 0; 
     *pi = 10; 
     return 0; 
} 
$ gcc -g sig.c 
$ ./a.out 
Bail 
$ gdb ./a.out 
GNU gdb 6.6-debian 
Copyright (C) 2006 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "i486-linux-gnu"... 
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1". 
(gdb) run 
Starting program: /home/elcapaldo/a.out 

Program received signal SIGSEGV, Segmentation fault. 
0x08048421 in main() at sig.c:15 
15    *pi = 10; 
(gdb) where 
#0 0x08048421 in main() at sig.c:15 
(gdb) c 
Continuing. 
Bail 

Program exited with code 01. 
(gdb) q 
+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। नहीं, असल में, मैंने "सभी स्टॉप को संभाला" इस्तेमाल किया, और यह काम नहीं किया। यहां तक ​​कि मैंने "सभी नापस को संभालने" की कोशिश की, ऐप ने अभी भी SIGSEGV पकड़ा, और सामान्य रूप से बाहर निकला। – Blad

+0

सही, मैं फिर से डीबग किया। ऐसा लगता है कि दुर्घटनाग्रस्त लोकगीत प्रक्रिया में हुआ था। – Blad

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