2010-02-17 47 views
1

我有阿帕奇post_config處理這種奇怪的行爲:C 64位服務器上奇怪的行爲

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是在另一個文件中聲明,並在標題中聲明的自定義功能(這是在編譯時解析) 。

在第二步,我可以看到的配置有一個有效值,但第3步失敗,一個SEGSEGV,如果我嘗試調試它,我可以看到這一點:

//第2步 GDB:打印配置 $ 1 =(my_config_t *)0x7a8098

//步驟3 GDB:打印配置 不能在地址0x38

回答

0

我發現了一個問題。

在log_me我正在:

INT爲nbytes = strlen的(消息);代替

apr_size_t爲nbytes = strlen的(消息);

在64位上,這一切都搞砸了..不知道爲什麼。

+0

這似乎不太可能是真正的問題。它更有可能轉移堆棧或內存使用並隱藏問題。 – 2010-02-17 16:13:06

+0

其實如果我評論這個處理程序我沒有問題。 此模塊也可以在默認的32位(gcc,apache和LD庫路徑)的Solaris 10上完美工作。在這裏,我全部都在64 – Alin 2010-02-17 16:19:21

+0

也許你沒有在包含'log_me'的文件中包含'string.h'? – 2010-02-18 01:07:12

1

什麼是ptemp傳遞給setup_module,並且將它用作sprintf的緩衝區是安全的嗎?是否有可能ptemp指向一個不足以容納該字符串的內存區域?

也許你應該聲明一個自動變量(char buffer[80];)並將它用於你的sprintf?

+0

ptemp是配置階段後清除的臨時內存池。 apr_psprintf是由apr(Apache便攜式運行時)提供的功能,不應像您提及的那樣存在緩衝區問題 – Alin 2010-02-17 20:52:54