分析来自交叉编译的linux目标的崩溃转储

时间:2014-05-26 07:22:15

标签: linux debugging gdb cross-compiling

我遇到的问题是分析在我无法访问的linux机器上生成的故障转储。情况如下:

  • 在运行Ubuntu 14.04,13.10和14.04等发行版的Linux机器上进行开发。
  • 目标是基于x86的嵌入式系统,它在剥离的情况下运行 下载Debian 5
  • 目标的构建发生在其中一台开发机器上,具体取决于发布者是谁。我们使用chroot环境来进行交叉构建,我们非常确定chroot环境是相同的(通过git控制版本)

顺便说一句,该软件是用C ++编写的。

现在软件在我们无法重现的情况下崩溃,因此我们的用户通过电子邮件向我们发送核心文件。该计划如下所示:

  • 使用chroot-environment中的debug-symbols编译相同版本的软件
  • 使用GDB查看核心文件,也在chroot环境中。

这通常可以正常工作,除了一个问题。它只适用于调试发生在同一台机器上的剥离和已发布的二进制文件构建。在其他机器上,调试器似乎感到困惑,堆栈跟踪可能包含完全不相关的调用,这些调用没有任何意义。这是我们一直想知道的事情,现在没有结论。这也是我们可以轻松处理的情况。

但是在我的机器上发生了一些无意识的升级到新分发的情况,从我做的构建的目标渲染所有核心文件是无用的......

现在我正在寻找一种方法来(a)了解正在发生的事情,以及(b)一种交叉调试核心文件的方法,这些核心文件在机器上生成而无法进行远程访问,从而运行不同的Linux发行版。哦,(c)如果我们可能做了一些根本错误的事情?

1 个答案:

答案 0 :(得分:0)

  

只有在同一台计算机上进行调试时才会起作用,剥离和释放的二进制文件都是在这个机器上构建的   (a)了解正在发生的事情

很明显,尽管你相信你有一个密封的构建环境,但你实际上并不是。如果你确实有一个完全密封的构建环境,那么在不同的机器上构建并不重要。

因此,您的第一步应该是找到并消除所有非密封的内容,直到您可以在构建版本的每台计算机上构建位相同的版本。

一旦你实现了这一点,它也应该解决你的(b)问题。

  

(c)如果我们可能做了一些根本错误的事情?

你认为从根本上做错的是你相信你的chroot是版本控制的,当它看起来显然不是。