Как мне отладить код, который segfaults, если не запустить через GDB? - PullRequest
2 голосов
/ 09 июля 2010

Это однопоточный код.

В частности: модуль расширения ahocorasick Python (easy_install ahocorasick).

Я выделил проблему на тривиальный пример:

import ahocorasick
t = ahocorasick.KeywordTree()
t.add("a")

Когда я запускаю его в gdb, все в порядке, то же самое происходит, когда я ввожу эти инструкции в Python CLI. Однако, когда я пытаюсь запустить скрипт регулярно, у меня возникает ошибка.

Чтобы сделать это еще более странным, строка, вызывающая segfault (идентифицированная анализом дампа ядра), представляет собой обычное увеличение int (см. Нижнюю часть тела функции).

Я полностью застрял к этому моменту, что я могу сделать?

int
aho_corasick_addstring(aho_corasick_t *in, unsigned char *string, size_t n)
{
    aho_corasick_t* g = in;
    aho_corasick_state_t *state,*s = NULL;
    int j = 0;

    state = g->zerostate;

    // As long as we have transitions follow them
    while( j != n &&
           (s = aho_corasick_goto_get(state,*(string+j))) != FAIL )
    {
        state = s;
        ++j;
    }

    if ( j == n ) {
        /* dyoo: added so that if a keyword ends up in a prefix
           of another, we still mark that as a match.*/
        aho_corasick_output(s) = j;
        return 0;
    }

    while( j != n )
    {
        // Create new state
        if ( (s = xalloc(sizeof(aho_corasick_state_t))) == NULL )
            return -1;
        s->id = g->newstate++;
        debug(printf("allocating state %d\n", s->id)); /* debug */ 
        s->depth = state->depth + 1;

        /* FIXME: check the error return value of
           aho_corasick_goto_initialize. */
        aho_corasick_goto_initialize(s);

        // Create transition
        aho_corasick_goto_set(state,*(string+j), s);
        debug(printf("%u -> %c -> %u\n",state->id,*(string+j),s->id));
        state = s;
        aho_corasick_output(s) = 0;
        aho_corasick_fail(s) = NULL;
        ++j;                                 // <--- HERE!
    }

    aho_corasick_output(s) = n;

    return 0;
}

Ответы [ 2 ]

2 голосов
/ 09 июля 2010

Есть и другие инструменты, которые вы можете использовать, чтобы найти ошибки, которые не обязательно приводят к сбою программы. valgrind , электрический забор , cleany , coverity и lint подобные инструменты могут помочь вам.

В некоторых случаях вам может понадобиться создать свой собственный питон, чтобы его можно было использовать.Кроме того, что касается повреждения памяти, есть (или не было расширений в течение некоторого времени) возможность позволить python использовать прямое выделение памяти вместо собственных python.

0 голосов
/ 09 июля 2010

Вы пытались перевести этот цикл while в цикл for?Возможно, с ++j возникнет некоторое тонкое недопонимание, которое исчезнет, ​​если вы используете что-то более интуитивное.

...