gdb: установите контрольную точку для укладчика SIGBUS

Я пытаюсь отладить простого сборщика мусора остановки-и-копии (написанный в C) использующий GDB. GC работает, обращаясь с SIGBUS. Я установил контрольную точку наверху своего укладчика сигнала SIGBUS. Я сказал GDB передавать SIGBUS к своей программе. Однако это, кажется, не работает.

Следующая программа (объяснил действующий) показывает сущность моей проблемы:

#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;
} 

Я собираю и управляю программой на Mac OS X 10.6 и получаю продукцию, которую я ожидаю:

$ gcc debug.c
$ ./a.out
GC TIME
Bus error

Я хочу управлять и отладить эту программу, используя GDB. В частности, я хочу установить контрольную точку в функции GC (действительно, укладчик сигнала GC). Естественно, я должен сказать GDB не останавливаться на SIGBUS также:

$ 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) 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) 

По-видимому, укладчик сигнала не призван (ВРЕМЯ GC не напечатано). Кроме того, мы находимся все еще в главном () в обвиняющем mov:

0x0000000100000e83 <main+247>:  movq   $0x5a,(%rax)

Какие-либо идеи?

Спасибо.

9
задан Arjun Guha 11 January 2010 в 19:04
поделиться

3 ответа

Вы также можете использовать массив объектов и A для LOOP, если вам нужно сделать это много раз.

-121--3572514-

Один и тот же код (модифицированный для обработки Sigsegv тоже) работает как ожидается, в GDB на Linux; Это может быть ошибка в порту ОС X или GDB к этой платформе.

Гуглинг находит Сломанное поведение OS X Так же, как и ваш путь назад на 10.1, со своего рода обходной путь ( устанавливает подъемный порт перед запуском Программа).

(есть аналогичная ошибка в Windows .)

5
ответ дан 4 December 2019 в 13:01
поделиться

Я думаю, что попытаюсь ответить на свой собственный вопрос, предоставив некоторую обновленную информацию о дальнейших исследованиях, которые я провел. По умолчанию старые версии заглушек Axis2 могут быть только «совместимыми с потоком» (не могут одновременно выполнять вызовы одного и того же экземпляра заглушки из нескольких потоков, но вызовы различных экземпляров являются нормальными).

См., например:

http://markmail.org/message/3lu7x7pfo47vgnck http://markmail.org/message/sljyf6lpecxqllgx

При отсутствии вызова метода cleanup/cleanupTransport могут возникнуть некоторые утечки сокетов, а также отсутствие сокетов.

http://issues.apache.org/jira/browse/AXIS2-3670

В некоторых случаях, по крайней мере, лежащий в его основе StartClient теперь кажется защищенным от потоков, но в зависимости от того, как вы создали ваш клиент, вся заглушка может быть не такой:

http://amilachinthaka.blogspot.com/2009/05/improving-axis2-client-http-transport.html

-121--1678540-

Ну, Swing является более богатым с точки зрения готовых компонентов, чем AWT. Я использовал оба, и я предпочитаю Свинг, а не AWT. Кроме того, вам не нужно учиться AWT, чтобы изучать основы Swing. Руководство Sun's Swing является хорошим источником для начала изучения структуры Swing.

-121--3080592-

Как установить для (;;); после printf () , нормально запустить программу, а затем подключиться к процессу с помощью gdb после распечатки GC TIME?

4
ответ дан 4 December 2019 в 13:01
поделиться

Почему вы ожидаете получить SigBus? SigBus обычно означает ошибку выравнивания, на архитектуре, где некоторые типы данных имеют требования к выравниванию. Похоже, вы просто пытаетесь получить доступ к памяти за пределами выделенного района, и я ожидаю, что вы получаете SIGSEGV вместо SigBus.

Редактировать:

Кажется, что название Mac OS X для того, что я думаю о том, что SIGSEGV - SigBus. Поэтому игнорируйте этот ответ.

Если это какая-либо помощь, точка останова работает, как ожидалось (то есть, он работает), когда я пробую программу в системе Linux, с SigBus заменен Sigsegv.

Отредактируйте 2:

Можете ли вы попытаться поймать Sigsegv в вашей программе тоже? Похоже, что тип сигнала может варьироваться в зависимости от того, где память отображается в Mac OS X (я просто прочитал обсуждение здесь и здесь ), и, возможно, другой сигнал может быть брошенным, когда вы бежите в отладчике?

2
ответ дан 4 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: