静态链接系统库,libc,pthreads,以帮助调试

时间:2012-07-25 16:14:53

标签: c++ linux gdb libc postmortem-debugging

我正在尝试避免此Stackoverflow条目中描述的情况:Debugging core files generated on a Customer's box。如果我静态编译所有库,我会避免在核心转储时总是收集共享库吗?我本质上希望处于这样一种情况:我可以用gdb加载核心文件并检查崩溃的应用程序。

如果我沿着静态链接我们需要的所有库的路线,应该注意什么。我认为glib和pthreads可能会导致最大的问题。

Valgrind会不会有用吗?如果我将Valgrind加载到具有静态编译的所有内容的二进制文件中它会发现错误吗?或者我们应该维护一个非静态编译的二进制文件,以便Valgrind继续工作。 strace怎么样?

我们经常崩溃,因为我们有一个大型安装基础,它也是一个遗留应用程序。收集所有共享库变得棘手 - 我需要另一种解决方案。

编辑:修正错字。

1 个答案:

答案 0 :(得分:2)

  

如果我静态编译所有库,我将避免在核心转储时总是收集共享库

然而,与流行的看法相反,静态链接的二进制文件比动态链接的二进制文件更少可移植(至少在Linux上)。

特别是,如果您使用以下任何功能:gethostbynamegethostbyaddrgetpwentgetpwnamgetpwuid(还有更多) ,您将在链接时收到警告,类似于:

Using 'getpwuid' in statically linked applications requires at runtime
the shared libraries from the glibc version used for linking.

此警告的含义是 IF 您的客户安装了与您在链接时使用的glibc不同版本的glibc(即与您的系统libc不同), 然后您的程序可能会崩溃。由于这比现在的情况明显更糟,我不相信静态链接对你来说是一个很好的解决方案。