Я много занимался программированием, но немного на C, и мне нужен совет по отладке. У меня есть статическая переменная (область видимости файла), которая блокируется примерно через 10-100 секунд выполнения многопоточной программы (используя pthreads в OS X 10.4). Мой код выглядит примерно так:
static float some_values[SIZE];
static int * addr;
addr
указывает на действительный адрес памяти на некоторое время, а затем получает некоторое значение (иногда 0, иногда ненулевое), вызывая, таким образом, segfault при разыменовании. Изучая gdb
, я убедился, что addr
размещается в памяти сразу после some_values
, как и следовало ожидать, поэтому мое первое предположение состояло бы в том, что я использовал индекс «вне границ» для записи в some_values
. Однако это крошечный файл, поэтому легко проверить, что это не проблема.
Очевидным методом отладки будет установка точки наблюдения для переменной addr
. Но это, похоже, приводит к неустойчивому и необъяснимому поведению в gdb
. Точка наблюдения срабатывает при первом назначении addr
; затем, после продолжения выполнения, я немедленно получаю бессмысленную ошибку сегмента в другом потоке ... предположительно, ошибку сегмента при обращении к адресу статической переменной в другой части программы! Но тогда gdb
позволяет мне читать и писать по этому адресу памяти в интерактивном режиме.
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x001d5bd0
0x0000678d in receive (arg=0x0) at mainloop.c:39
39 sample_buf_cleared ++;
(gdb) p &sample_buf_cleared
$17 = (int *) 0x1d5bd0
(gdb) p sample_buf_cleared
$18 = 1
(gdb) set sample_buf_cleared = 2
(gdb)
gdb
явно в замешательстве. Кто-нибудь знает почему? Или у кого-нибудь есть предложения по устранению этой ошибки без использования точек наблюдения?