我想在应用程序崩溃时获取堆栈跟踪。 我明白,-rdynamic选项可以使用函数名称获取完整的堆栈跟踪。 但是我担心是否会对我的申请performance有任何影响。
是的,虽然这是非常具体的,通常不会引起关注。
-rdynamic选项指示链接器将符号添加到运行时通常不需要的符号表中。 这意味着动态链接程序需要在运行时扫描符号解析的更多,也许更多的符号。
具体来说,由于基于GNU的系统中的符号表查找是使用散列来实现的,因此具有更多符号会增加散列冲突的可能性。 由于在哈希表中碰撞的所有symols都位于列表中,因此运行时链接程序需要遍历列表并使用memcmp比较每个符号的名称。 具有更多符号的散列意义具有更长的列表,因此需要更多时间来解析每个动态符号。
对于C ++和C来说,这种情况稍微糟糕,因为类名称带有许多相同的前缀符号名称。
实际上,这只是第一次使用符号,所以,除非你的应用程序非常大,并且包含很多符号,否则不会被感觉到。
在罕见的情况下,您的应用程序是如此之大,像预链接技巧可以用来克服开销。