使用 gdb 脚本捕获 crash 时的 stack

crashreport.gdb

在看TrinityCore代码时,看到一段有趣的脚本(crashreport.gdb):

set logging overwrite on
set logging file backtrace.log.temp
set style enabled off
set height unlimited
set width unlimited
set disassembly-flavor intel
handle SIG33 pass nostop noprint
set pagination 0
set logging on
echo \n--- DEBUG: --- START\n\n
run
# check if exited normally
if $_isvoid($_exitcode)
  echo \n--- DEBUG: BACKTRACE FULL\n
  # print assertion message if this is ASSERT crash
  if TrinityAssertionFailedMessage != 0
    printf "%s\n", TrinityAssertionFailedMessage
  end
  echo \n
  backtrace full
  echo \n--- DEBUG: INFO REGISTERS\n\n
  info registers
  echo \n--- DEBUG: CALLS (x/16i $pc)\n\n
  x/16i $pc
  echo \n--- DEBUG: THREAD APPLY ALL BACKTRACE\n
  thread apply all backtrace
  echo \n--- DEBUG: --- STOP\n\n
  echo Generated by crashreport.gdb script version 1.4\n
  set logging off

  # rename log file to avoid it getting overwritten by restart scripts
  shell mv backtrace.log.temp backtrace_$(date +%Y-%m-%d-%T).log
else
  # normal exit, cleanup temp file
  set logging off
  shell rm backtrace.log.temp
end
quit

脚本内容都是 gdb 的命令,很简单,可问 ChatGPT

这段脚本,可以在程序 crash 时,把堆栈信息,存入文件

如何使用

gdb -x crashreport.gdb <executable file>

其他

原来我的做法是,用 signal 在程序内注册异常处理句柄,执行 gdb 命令

相比而言,这种方法更轻便、灵活,且无侵入性

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fananchong2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值