2012-06-05 127 views
7

我在改變LD_LIBRARY_PATH時有奇怪的副作用。LD_LIBRARY_PATH副作用

當我附加一個包含庫的路徑時,例如:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 

然後,一切都變得令人難以置信的慢。例如,簡單的ls可以是10秒鐘。

ldd輸出是完全一樣的前後LD_LIBRARY_PATH變化後,我試圖用strace調試慢ls的執行:我得到了這兩種情況下完全相同的執行。在執行ls時執行甚至沒有卡住(因爲strace在10秒的延遲期間不輸出任何內容,然後突然完美地執行ls)。所以我認爲它可能來自我的shell,但這是相同的,在我的bash上運行strace並在兩種情況下都執行ls給我相同的strace輸出:shell執行ls並等待其執行結束(最後一個strace輸出滯後stracewaitpid(...))。所以我猜想ls的啓動和它的執行之間會發生錯誤,就像它是內核級別的問題一樣。它的行爲就好像是sleep是在ls(0 cpu使用率)上生成的。

期間的滯後性,我的CPU和網絡活動是完全正常的...

注意的是,在新的LD路徑中的庫不與任何「標準庫」相沖突,所以它不會打擾在我ls例。

所以我對LD_LIBRARY_PATH副作用或如何深入調試我的例子的深入解釋很有趣。

+0

好問題。我使用過'LD_LIBRARY_PATH'並且從未見過這種行爲,但你的觀察看起來既孤立又清晰。有趣。 – thb

+7

'export LD_DEBUG = all'和'man 8 ld.so' –

+0

顯而易見,但如果ls使用LD_LIBRARY_PATH中的任何內容,「ldd $(which ls)」可能會提供線索。 – Matthias

回答

0

我不確定你的LD_LIBRARY_PATH或者你正在試圖添加的庫還有你正在運行的程序還有什麼,但是你可能最好是編寫一個包裝腳本來改變LD_LIBRARY_PATH,只爲需要額外的程序庫,以便您的系統功能(如ls)不受影響。

#!/bin/bash 
export LD_LIBRARY_PATH=/my_path/lib 
program_name 

創建文件和chmod +x wrapper_name

+1

是的,我同意你的看法,但我只是現有構建系統的受害者...... –

1

這篇文章是退出的時候,所以我不知道你是否已經找到一個解決方案。無論如何,我不知道這是否會有所幫助,但是在大多數現代GNU/Linux系統中,使用LD_LIBRARY_PATH已被棄用並且不鼓勵。

因此,我有幾個建議:

  1. ,如果你想繼續使用它

    ,首先試試未決前,而不是附加庫路徑到LD_LIBRARY_PATH。如果需要很長時間掃描以前庫目錄中的路徑,這應該有所幫助。

  2. 使用LDCONFIG系統,這是現在使用LD目錄的(新)正確方式。您只需在/etc/ld.so.conf文件中將路徑添加到您的庫中,或者更好的方式是在/etc/ld.so.conf中添加一個文件。d /包含您的庫的路徑(如果在/etc/ld.so.conf中包含include指令(默認情況下通常是這種情況),它將被採用。然後運行sudo ldconfig更新系統LD搜索路徑。

我希望這可以幫到你。歡呼聲