2014-10-29 51 views
0

我陷入了一個奇怪的問題。我有一個使用gyp項目創建的exe文件,並且common.gypi支持爲32位和64位linux構建exe文件。但是,當我構建64位Linux並在代碼中的某個位置調用memcpy時,內容將被清零。使用-m32標誌爲32位平臺構建不會導致此問題。我懷疑這個頭文件可能存在問題,因爲這個項目的頭文件在32位和64位平臺上都很常見。有人可以提供一些指導如何解決這個問題?二進制文件是動態鏈接的,使用GLIBC lgcc,lc和lm。任何在這方面的指針都非常感謝。 我很樂意提供所需的任何其他信息。 謝謝。使用64位Linux的memcpy清零內容

UPDATE:代碼片段的點點滴滴: 這是代碼的基本片段:

dst->flags   = src->flags; 
src->b = dst->b; 
and few more assignments 
memcpy(dst, src, size here is 152); 
size of dst is 224 and size of src is 496. 

的問題是,最初被複制到DST被調用的memcpy後變爲零標誌的值。爲32bit構建時的相同邏輯工作得很好。

+0

不可能回答這麼具體的問題。 Memcpy會複製記憶,無論如何,這都是關於它的。如果它看起來沒有 - 其他地方有一個錯誤。你可以使用valgrind來追蹤內存訪問錯誤。 – keltar 2014-10-29 07:04:16

+0

我實際上將我的32位設置移植到了64位,我所做的只是從項目中刪除了-m32標誌,用於64位構建,我希望這能夠工作。我可能會給valgrind一個鏡頭,但是它不應該確定內存泄漏嗎?我也嘗試在函數中直接使用memcpy,包括字符串頭文件,但仍然沒有解決問題。我唯一懷疑它可能是因爲src和dest的大小不同,並且定義的某個地方可能會搞亂這些結構。 – 2014-10-29 07:16:26

+0

如果以前不明顯的問題並不意味着它不存在。或代碼不適合64位方案,例如它意味着sizeof(size_t)== sizeof(int)。 Valgrind有許多工具,你需要的是memcheck。 – keltar 2014-10-29 07:23:53

回答

2

仔細閱讀memcpy(3)的文檔。源和目標區域不允許重疊(否則它是undefined behavior)。編譯時不要忘記啓用所有警告和調試信息(gcc -Wall -Wextra -g

您可能想用memmove(3)代替。

要調試這樣的問題,你可以在gdb調試器設置觀察點與watch命令,並與近期GCC你可以使用-fsanitize=address作爲一個編譯標誌。或valgrind等...

+0

所有的公平點。順便說一下,Valgrind報告memcpy重疊。 – keltar 2014-10-29 09:48:59