我以两种方式“解决”了这个问题:
>我为SIGSEGV安装了一个信号处理程序,并使用backtrace / backtrace_symbols打印出堆栈跟踪.我用-rdynamic编译了我的代码,所以即使在剥离调试信息后,我仍然得到一个带有意义名称的回溯(同时保持可执行文件足够紧凑).
我删除了调试信息并将其放在一个单独的文件中,我将使用strip将其保存在安全的地方;从那里,我将使用add22line与从回溯(地址)保存的信息来了解问题发生的位置.这样我只需要存储几个字节.
>或者,我发现我可以使用/ proc / self / coredump_filter来转储内存(将其内容设置为“0”):只有线程和proc信息,寄存器,堆栈跟踪等都保存在核心中.在this answer中查看更多
我仍然丢失可能很珍贵的信息(全球和地方变量内容,参数……).我可以很容易地找出要转储的页面,但遗憾的是没有办法为正常的核心转储指定“dump-these-pages”(除非你愿意去修补内核中的maydump()函数) ).
现在,我对2种解决方案感到非常满意(总比没有好……)我的下一步行动将是:
>看看将Breakpad移植到powerpc-linux有多困难:已经有powerpc-darwin和i386-linux这样有多难? 🙂
>尝试使用google-coredumper只转储当前ESP周围的几页(应该给我本地和参数)和“& some_global”(这应该给我全局).