gpt4 book ai didi

linux - 如何将核心文件与其关联的可执行文件捆绑在一起?

转载 作者:太空狗 更新时间:2023-10-29 11:15:39 26 4
gpt4 key购买 nike

如何将核心文件与其关联的可执行文件和共享库捆绑在一起?

当一个程序崩溃时,它会生成一个核心文件,我可以用它来用 gdb 调试它。但是,如果有人在我身后出现并“帮助”重新编译程序并打开额外调试,或升级包,或以任何方式扰乱系统,则该核心文件将变得毫无用处。

所以我想要的是一种将核心文件与它引用的所有其他二进制文件捆绑到一个大文件中的方法。

那么,当然,我还需要一种在gdb中打开这个文件的方法。我不想将文件“提取”回其原始位置并覆盖升级或更改的二进制文件。我在想象一个 shell 脚本,它将二进制文件提取到一个临时目录,然后告诉 gdb 在那里查找。

最佳答案

gdb 已经有了你想要的信息(info sharedlib):

$ gdb -ex 'set height 0' -ex 'set confirm off' \
-ex 'file /path/to/exe' -ex 'core-file core.pid' \
-ex 'info sharedlib' -ex quit

因此,您自然可以要求 gdb 为您提供此列表,然后您可以从那里创建一个“gdb-bundle”tarball,其中包含可执行文件和 gdb 报告的所有共享库。

我写了一个脚本来自动化这个:

#!/bin/sh
me=$(basename $0)

usage() {
echo "Usage:
$me -p <pid>
$me <executable> <core>

DESCRIPTION
$me - Creates a tarball containing the executable, it's core dump and
all the shared libraries that gdb said it loads.

OPTIONS
-p <pid> A running process id of a process to be bundled.
-h Show this help message"
}

pid=
while getopts hp: opt
do
case "$opt" in
p)
pid="$OPTARG"
;;
h)
usage
exit
;;
\?)
echo Unknown option
exit
;;
esac
done
shift $(($OPTIND -1))
executable=$1
corename=$2

if [ -n "$pid" ]; then
test "$pid" -gt 0 || { echo "pid must be numeric"; exit 1; }
proc=/proc/$pid/exe
executable=`readlink -e $proc` ||
{ echo "Could not readlink $proc"; exit 1; }
corename=${basename}.$pid.core
else
test -z "$executable" && usage && exit 1;
test -z "$corename" && usage && exit 1;
fi

basename=$(basename $executable)
if [ -n "$pid" ]; then
sharedlibs=$(gdb -ex "attach $pid" -ex 'set height 0' \
-ex 'set confirm off' -ex "generate-core-file $corename" \
-ex 'info sharedlib' -ex quit|
sed -n '/Shared Object Library/,/^(/p'|grep -E '(Yes|No)'|
sed -e 's,[^/]\+,,') || exit 1
dir="gdb-${basename}.$pid.$(date +%F-%H%M%S)"
else
sharedlibs=$(gdb -ex 'set height 0' -ex 'set confirm off' \
-ex "file $executable" -ex "core-file $corename" \
-ex 'info sharedlib' -ex quit|
sed -n '/Shared Object Library/,/^(/p'|grep -E '(Yes|No)'|
sed -e 's,[^/]\+,,') || exit 1
dir="gdb-${basename}.$(date +%F-%H%M%S)"
fi

mkdir "$dir" && cp "$corename" "$dir" &&
tar chf - $sharedlibs $executable|tar -C $dir -xf - &&
echo -e "gdb:\n\tgdb -ex 'set solib-absolute-prefix ./'" \
"-ex 'file .$executable' -ex 'core-file ./$corename' " \
> $dir/makefile &&
echo tar czf $dir.tar.gz $dir &&
tar czf $dir.tar.gz $dir

关于linux - 如何将核心文件与其关联的可执行文件捆绑在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11112838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com