Articles of 转储

在Linux核心转储中只转储堆栈跟踪

有没有办法在Linux中创build进程崩溃[如在Windows]的微型转储。 通常的核心转储大小很大,但是我只想得到转储的堆栈跟踪。 是否有可能只转储堆栈跟踪? 我猜设置ulimit值的最大值不会帮助我,因为我不关心的大小,我只是不需要一个完整的内存转储。 此外,我读了谷歌的Breakpad,但Breakpad会让我不得不钻研代码来设置它。 我不想修改代码。

如何使用转储和恢复来克隆Linux操作系统驱动器

你可以在网上find大量有关使用dd来克隆OS驱动器的信息。 不要听! 使用dump和restore要快得多,因为您只复制数据,而不是复制所有块(空或不)。 第1部分:了解您的源驱动器和目标驱动器在设备列表中的位置 lsscsi | grep sd* 将显示一个scsi设备及其相关字母的列表。 如果您足够幸运能够使用热插拔盒子,那么您可以在插入驱动器之前和之后简单地运行该命令 – 显示的最新设备当然是您刚刚插入的驱动器。 第2部分:准备转储 安全提示:为目标和源设备分配variables。 (另外,如果你不止一次这样做,可变化允许你重用这些命令。) SOURCE=/dev/sdx DEST=/dev/sdy 关于源驱动器(从中复制的驱动器)的注释。 如果您正在复制当前的操作系统驱动器,它将(duh)已经挂载。 如果您正在复制另一个驱动器,则实际上不需要安装。 将源驱动器的分区表复制到一个文件: sfdisk -d $SOURCE > part_table 复制已存储在文件sfdisk –force $DEST < part_table 清零引导扇区: dd if=/dev/zero of=${DEST}1 bs=512 count=1 制作文件系统(一次一个分区): mkfs -t ext4 ${DEST}1 mkswap ${DEST}2 看看: parted $DEST –script print 复制所有非交换分区的标签。 例如: tune2fs -L "/" /${DEST}1 […]

Linux(MIPS):查看核心转储时暂时“更改”注册内容

在我的应用程序中的一些线程坐在优化function,当我debugging应用程序,gdb不能从这些function回溯。 但是我已经看过了汇编程序,并且可以通过执行以下操作来手动部分地将堆栈展开到前一个函数的框架: set $old_ra = $ra set $old_sp = $sp set $ra = *(unsigned long*)($sp+28) set $sp = $sp + 48 bt set $ra = $old_ra set $sp = $old_sp 如果我正在进行实时debugging,这完美地工作,它成功地显示一个完整的回溯。 我希望在查看核心转储时能够执行相同的离线操作。 显然,在一个核心转储中,戳一个寄存器的概念是毫无意义的,但是有没有办法告诉gdb“只用这个值作为寄存器”,所以我可以做一个类似的回溯?

我怎样才能读取小型转储?

我有一个小型转储写入文件通过: MiniDumpWriteDump 。 该文件是从客户端发送给我(即我不能使用某种即时debugging器)。 我的问题是:我如何打开它? Visual Studio提供错误:“不支持debugging旧格式的故障转储”。 我GOOGLE了一下,发现人们用visual studio打开内核转储。 这不是内核转储,只是应用程序崩溃的转储。 我也尝试用WinDbg打开它,但是无法打开它。 我怎样才能得到这些信息?

如何从核心转储中提取EBP和ESP?

我试图分析一个没有debugging信息(Linux)的程序的核心转储。 分析应该在C中自动完成,所以没有 GDB。 正如我在GDB中看到的,可以通过命令info registers获取堆栈指针的顶端和堆栈基址指针(ESP和EBP)。 而当我上下堆栈(上下命令),我看到当前帧的寄存器的更新版本。 我的问题是,我在哪里可以在核心转储中find这些信息? 我知道在包含NT_PRSTATUS,NT_PRPSINFO和NT_AUXV的核心转储中有一个NOTE部分。 但可悲的是,我找不到关于这些笔记的任何信息。 GDB如何构build框架,从哪里获取信息?

Linux:窥探一个信号,而不是为随后的核心转储废弃寄存器?

当我得到coredump导致的信号,我想运行我自己的处理程序将siginfo_t和ucontext_t结构复制到全局variables,以便它们可以在核心转储中访问。 目前在我的处理程序结束时,我重新分配了默认处理程序并调用raise(thesig)。 这样做的问题是核心转储“信息寄存器”显示我的处理程序中的寄存器的状态,而不是在原始信号的时间。 我意识到,既然我已经保存了ucontext_t,那么我可以查看原始寄存器值,但是当核心转储通过团队时,知识可能会丢失/遗忘。 所以我的问题是:是否有一种方法来重新调整信号,并确保核心转储文件保存原始信号的寄存器状态? 我想也许我可以使用一些内联asm来手动恢复处理程序末尾的所有regs,然后返回到导致信号而不是调用raise()的指令,但是我不确定是否可以保证re试图执行指令将导致与第一次尝试相同的信号行为。

如何从PythonGDB(GDB 7.1)gdb.execute输出?

我目前正在编写一个Python的GDB脚本。 问题是它必须与GDB 7.1兼容。 所以我首先编写了GDB 7.3.1的脚本,并使用以下函数接收gdb命令(GDB 7.3.1)的输出: myvar = gdb.execute("info target", False, True) 这个函数的最后一个参数是它应该返回结果作为一个string(这是完全有道理的,为什么我会执行这样的命令;)) 在GDB版本7.1中,虽然看起来最后一个参数不可用,所以这一行(GDB 7.1): myvar = gdb.execute("info target", False) 返回None 。 有没有机会检索这个命令的输出? 我已经尝试将我的python脚本的标准输出redirect到一个文件中,然后加载这个文件,但显然我的python脚本的标准input和输出被gdb环境覆盖,所以gdb.execute命令的输出没有被写入到我的文件。 我现在唯一能想到的就是用一个bash脚本来包装我的脚本,这个脚本首先用一个执行各种命令的python脚本打开gdb,然后把它转换成一个文件。 然后再次打开gdb,但用另一个加载文件的python脚本,parsing它,然后根据文件的input执行其他命令等等。 但这是我能想到的最丑陋的解决scheme。 那么有没有办法在GDB 7.1中接收gdb.execute的输出?

没有杀死进程的Linux核心转储

是否可以在不杀死进程的情况下生成核心转储? 如果是这样,那么命令/信号是怎么做的呢? 谢谢,吉姆

如何在GDB中打印最后收到的信号?

当一个核心转储加载到GDB时,会自动崩溃的原因被显示出来。 例如 程序终止信号11,分段故障。 有什么方法可以再次获取信息吗? 事情是,我正在写一个需要这些信息的脚本。 但是,如果信号仅在加载核心转储和amd后才可用,那么稍后将无法访问信息。 这样一个重要的function真的没有命令吗?

C ++崩溃转储,在Win32exception(使用catch(…)时)的堆栈展开 – VS 2003

像Just In Timedebugging一样,VS 2003编译的应用程序是否捕获到catch(…)中的Win32(或asynchronous)exception,并展开堆栈? 转储文件写入之前…