我在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的内存
答案 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位,这搞砸了所有......不知道为什么。