C Странное поведение на 64-битном сервере - PullRequest
1 голос
/ 17 февраля 2010

У меня странное поведение в обработчике Apache post_config:

int setup_module(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp,server_rec *s)
{
    //1
    my_config_t *config =  ap_get_module_config(s->module_config, &my_module);

    //2
    log_me(config->logfp, apr_psprintf(ptemp, "My module version %s\n", MY_VERSION));

    //3
    log_me(config->logfp, "Starting the batch job");

    return OK;
}

log_me - это пользовательская функция, объявленная в другом файле и объявленная в заголовке (она разрешается во время компиляции).

На шаге 2 я вижу, что config имеет допустимое значение, однако шаг 3 завершается неудачно с SEGSEGV, и если я пытаюсь его отладить, я вижу это:

// шаг 2 gdb: print config $ 1 = (my_config_t *) 0x7a8098

// шаг 3 gdb: печать конфигурации Не удается получить доступ к памяти по адресу 0x38

Ответы [ 3 ]

1 голос
/ 17 февраля 2010

Что ptemp передается в setup_module, и безопасно ли его использовать в качестве буфера для вашего sprintf? Возможно ли ptemp указывать на область памяти, которая недостаточно велика для хранения этой строки?

Может быть, вы должны объявить авто переменную (char buffer[80];) и использовать ее для своего sprintf?

1 голос
/ 17 февраля 2010

Что-то перезаписывает указатель конфигурации.Можете ли вы установить точку останова в области памяти и посмотреть, что выполняет перезапись?Вот как это сделать: http://www.technochakra.com/debugging-types-of-data-breakpoints-in-gdb/

0 голосов
/ 17 февраля 2010

Я нашел проблему.

В log_me я делал:

int nbytes = strlen (message);

вместо:

apr_size_t nbytes = strlen (message);

Находясь на 64 битах, это все испортило .. пока не знаю почему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...