2012-05-15 68 views
4

我將從proc *代碼從UNIX移植到LINUX。這些代碼已成功編譯並創建可執行文件。但在運行期間,它會引發分段錯誤。我一步一步地調試代碼,下面是GDB調試的輸出。strftime_l的SIGSEGV分段錯誤lib64/libc.so.6

Breakpoint 4 at 0x3b19690f50 
(gdb) n 
525    strftime (buf, MAX_STRING_LEN, "%d/%b/%Y:%H:%M:%S", dummy_time); 
(gdb) n 

Breakpoint 4, 0x0000003b19690f50 in strftime() from /lib64/libc.so.6 
(gdb) n 
Single stepping until exit from function strftime, 
which has no line number information. 
0x0000003b19690f70 in strftime_l() from /lib64/libc.so.6 
(gdb) n 
Single stepping until exit from function strftime_l, 
which has no line number information. 

Program received signal SIGSEGV, Segmentation fault. 
0x0000003b19690f8b in strftime_l() from /lib64/libc.so.6 

其實在代碼中函數strftime()被調用。但我不知道它爲什麼會在/lib64/libc.so.6中達到strftime_l()

此問題不在UNIX中提供。請幫忙。代碼是

static void speed_hack_libs(void) 
{ 
    time_t dummy_time_t = time(NULL); 
    struct tm *dummy_time = localtime (&dummy_time_t); 
    struct tm *other_dummy_time = gmtime (&dummy_time_t); 
    char buf[MAX_STRING_LEN]; 
    strftime (buf, MAX_STRING_LEN, "%d/%b/%Y:%H:%M:%S", dummy_time); 
} 
+0

請通過編輯將代碼添加到您的問題。 – dwalter

+0

更好地更新標題! Nevermind Linux是一個Unix(類似系統)... – 2012-05-15 11:12:35

+0

MAX_STRING_LEN的價值是什麼? –

回答

5
struct tm *dummy_time = localtime (&dummy_time_t); 
struct tm *other_dummy_time = gmtime (&dummy_time_t); 

這是不是要去工作。從man page

localtime()功能轉換爲日曆時間timep到破舊的時間表示,表示相對於用戶指定的時區。 ... 返回值指向一個靜態分配的結構,後續調用任何日期和時間函數可能會覆蓋該結構 。

gmtime()函數將日曆時間timep轉換爲以協調世界時(UTC)表示的細分時間表示。 它 可能返回NULL當年不符合整數。 返回值指向一個靜態分配的struct,可能會被隨後調用任何日期和時間函數覆蓋。

因此,*dummy_time可能會覆蓋您使用它的時間,並且包含不可預知的垃圾。你應該將數據複製到您的緩衝區這樣的:

struct tm dummy_time ; 
memcpy(&dummy_time, localtime (&dummy_time_t), sizeof(struct tm)); 

雖然我不知道怎麼會這樣導致SIGSEGV(可能是一些與獲取月份名稱等 - 檢查,如果問題仍然存在LC_ALL=C) ,你必須解決這個問題,然後才能繼續。另外,請檢查(在調試器中)*dummy_time的內容。

+0

非常感謝jpalecek !!!我修改了你提到的代碼。現在沒有分段錯誤!非常感謝!!!!我也設置了環境變量LC_ALL = C和memset()。需要檢查它是否工作,沒有LC_ALL = C和memset()。 – bhuvana

1

它調用strftime_l是因爲你編譯了64位 - 這是strftime的64位庫入口點。 strftime中有兩個指針 - 一個字符串和一個struct tm指針。其中之一是指向無效的記憶。 jpalacek給了你先看的地方。

+0

sorr Jim我不理解你的觀點它調用strftime_l是因爲你編譯了64位 - 這是strftime的64位庫入口點 – bhuvana

+0

你問了隱含的問題 - 我如何鏈接到strftime_l?答案就是libc 64庫中函數的符號名稱。沒有什麼是錯的。 –

+1

在'strftime_l'中,尾部的_l表示「locale」,而不是「long」。一個函數在確定進程的語言環境後調用另一個函數。在這個特定的環境中,裸「strftime」功能很少。 –

0

您是否添加了time.h頭文件?我想你已經錯過了。