函数名后面的数字在进程堆栈跟踪中表示什么

时间:2014-05-20 04:39:33

标签: c++ multithreading debugging

下面是其中一个主题的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 个答案:

答案 0 :(得分: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,这意味着它们位于 text 部分(包含代码的ELF部分)。 text 部分是不可写的(通常),因此它们是在编译时生成的。

总共有220个不同的_L_unlock_100函数(等等)。


你可以在网上找到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用于表示该符号是私有的(未导出),因此我们最终得到生成的名称 ,以及这个号码的来源。