C 64位服务器上的奇怪行为

时间:2010-02-17 15:47:53

标签: c apache module gdb

我在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是在另一个文件中声明的自定义函数,在头文件中声明(在编译时解析)。

在step2中,我可以看到config有一个有效的值,但是第3步失败并带有SEGSEGV,如果我尝试调试它,我可以看到:

//第2步 gdb:print config $ 1 =(my_config_t *)0x7a8098

//第3步 gdb:print config 无法访问地址0x38的内存

3 个答案:

答案 0 :(得分:1)

有些东西正在覆盖配置指针。你能在内存位置放一个断点,看看正在执行覆盖的是什么吗?以下是如何执行此操作的指南: http://www.technochakra.com/debugging-types-of-data-breakpoints-in-gdb/

答案 1 :(得分:1)

什么是ptemp传递给setup_module,将它用作sprintf的缓冲区是否安全?是否有可能ptemp指向一个不足以容纳该字符串的内存区域?

也许您应该声明一个自动变量(char buffer[80];)并将其用于您的sprintf?

答案 2 :(得分:0)

我发现了一个问题。

在log_me中我正在制作:

int nbytes = strlen(message);

而不是:

apr_size_t nbytes = strlen(message);

64位,这搞砸了所有......不知道为什么。