2014-05-20 57 views
-1

下面是一個線程的gtsack輸出。函數名稱後面的數字代表進程棧跟蹤

#0 0x00007fa6ba63edee in __lll_lock_wait_private() from /lib64/libc.so.6 
#1 0x00007fa6ba5f222d in _**L_lock_1598**() from /lib64/libc.so.6 
#2 0x00007fa6ba5f1fe6 in __tz_convert() from /lib64/libc.so.6 
#3 0x00007fa6ba5f06a4 in ranged_convert() from /lib64/libc.so.6 
#4 0x00007fa6ba5f0d4b in __mktime_internal() from /lib64/libc.so.6 

在這個軌跡中這是什麼1598後鎖定功能。它是否意味着任何相關性,並且每次調用鎖定函數後都會更改此數字?

+1

瞭解[name mangling](http://en.wikipedia.org/wiki/Name_mangling) – Rakib

+0

這僅僅是一個符號,不會因呼叫次數而改變。 –

+1

@RakibulHasan:或者不要,因爲它是一個C符號(來自'libc.so.6')。 –

回答

2

您可以使用nm庫得到的符號列表,例如:

$ nm /lib64/libc.so.6 | grep _L_lock_ | cut -d' ' -f 3 | uniq | head 
_L_lock_10 
_L_lock_100 
_L_lock_101 
_L_lock_10182 
_L_lock_1019 
_L_lock_1023 
_L_lock_10363 
_L_lock_104 
_L_lock_105 
_L_lock_10507 

(我數一共有我的機器142個不同的功能,但也有一些出現多次,共239個符號)

因此,不,這是「只是」一個固定的名稱。這些符號全部爲t,這意味着它們在文本部分(包含代碼的ELF部分)中。 文本部分不可寫(一般),因此它們是在編譯時生成的。

還有總共220個不同的功能(等等)。


你可以找到在網絡上的libc(他們使用git)的代碼,在一幀跳躍tzset.c#594我們看到了一個呼叫__libc_lock_lock (tzset_lock);這是定義爲宏:

# define __libc_lock_lock(NAME) \ 
    ({ lll_lock (NAME, LLL_PRIVATE); 0; }) 

lll_lock用於低級鎖,LLL_PRIVATE用於說明該符號是私有的(未導出),因此我們最終生成名稱爲,這就是數字的來源。