के लिए ब्रेकपॉइंट सेट करें, मैं जीडीबी का उपयोग करके एक साधारण स्टॉप-एंड-कॉपी कचरा कलेक्टर (सी में लिखित) डीबग करने की कोशिश कर रहा हूं। जीसी सिगबस को संभालने से काम करता है। मैंने अपने सिगबस सिग्नल हैंडलर के शीर्ष पर ब्रेकपॉइंट सेट किया है। मैंने जीडीबी को अपने कार्यक्रम में सिगबस पास करने के लिए कहा है। हालांकि, यह काम नहीं करता है।जीडीबी: एक सिगबस हैंडलर
#include <stdio.h>
#include <sys/mman.h>
#include <assert.h>
#include <signal.h>
#define HEAP_SIZE 4096
unsigned long int *heap;
void gc(int n) {
signal(SIGBUS, SIG_DFL); // just for debugging
printf("GC TIME\n");
}
int main() {
// Allocate twice the required heap size (two semi-spaces)
heap = mmap(NULL, HEAP_SIZE * 2, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED,
-1, 0);
assert (heap != MAP_FAILED);
// 2nd semi-space is unreadable. Using "bump-pointer allocation", a SIGBUS
// tells us we are out of space and need to GC.
void *guard = mmap(heap + HEAP_SIZE, HEAP_SIZE, PROT_NONE, MAP_ANON |
MAP_SHARED | MAP_FIXED, -1, 0);
assert (guard != MAP_FAILED);
signal(SIGBUS, gc);
heap[HEAP_SIZE] = 90; // pretend we are out of heap space
return 0;
}
मैं संकलन और मैक ओएस एक्स 10.6 पर कार्यक्रम चलाने के लिए और उत्पादन मैं उम्मीद मिलती है::
$ gcc debug.c
$ ./a.out
GC TIME
Bus error
निम्नलिखित कार्यक्रम (समझाया इनलाइन) मेरी समस्या का सार से पता चलता मैं जीडीबी का उपयोग करके इस कार्यक्रम को चलाने और डीबग करना चाहता हूं। विशेष रूप से, मैं जीसी फ़ंक्शन (वास्तव में, जीसी सिग्नल हैंडलर) पर ब्रेकपॉइंट सेट करना चाहता हूं।
$ gdb ./a.out
GNU gdb 6.3.50-20050815 (Apple version gdb-1346) (Fri Sep 18 20:40:51 UTC 2009)
... snip ...
(gdb) handle SIGSEGV SIGBUS nostop noprint
Signal Stop Print Pass to program Description
SIGBUS No No Yes Bus error
SIGSEGV No No Yes Segmentation fault
(gdb) break gc
Breakpoint 1 at 0x100000d6f
हालांकि, हम कभी नहीं ब्रेकपाइंट तक पहुँचने: स्वाभाविक रूप से, मैं GDB बताने के लिए और साथ ही SIGBUS पर रोक नहीं की जरूरत है
(gdb) run
Starting program: /snip/a.out
Reading symbols for shared libraries +. done
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x0000000100029000
0x0000000100000e83 in main()
(gdb)
जाहिर है, संकेत हैंडलर लागू नहीं किया गया है (जीसी समय नहीं है मुद्रित)। इसके अलावा, हम अभी भी मुख्य() में हैं, दोषपूर्ण mov:
0x0000000100000e83 <main+247>: movq $0x5a,(%rax)
कोई विचार?
धन्यवाद।
धन्यवाद, यह एक ओएस एक्स विशिष्ट बग है। कामकाज कार्यक्रम को पूरा करने के लिए चलाता है, लेकिन जीडीबी अब ब्रेकपॉइंट पर नहीं रोकता है। ओह ठीक है ... –
एक समाधान के लिए मेरा जवाब देखें जो आपको हैंडलर के अंदर तोड़ने देता है। – LaC