如何编写一个运行程序的 bash 脚本,直到它检测到信号 SIGSEGV、分段错误?

Posted

技术标签:

【中文标题】如何编写一个运行程序的 bash 脚本,直到它检测到信号 SIGSEGV、分段错误?【英文标题】:How do I write a bash script which runs a program until it senses signal SIGSEGV, Segmentation fault? 【发布时间】:2019-12-25 03:22:11 【问题描述】:

学习 C 指针,我确信昨天成功运行的程序涉及指向结构核心的指针,今天我什至没有碰它,至少我是这样认为的。合理吗?我不动态分配内存。 今天改了,但是我怎么写一个 bash 脚本 它将重新启动程序,直到它返回一个分段错误。 也许还可以计算在事件发生之前它可以执行程序多少次? 如何感知 SIGSEGV 信号?

【问题讨论】:

在这里发布您的 C 程序可能会更好地为您服务,这样我们就可以向您展示您在其中做错了什么。 “昨天成功运行的程序涉及指向今天转储给我的结构核心的指针”。这些是具有未定义行为的代码中的常见症状。通常是由无效的内存访问或内存损坏引起的。而且它不需要发生动态内存。如果您需要帮助查找问题,请显示您的代码。或者,如果在 Linux 中开发,请使用 valgrind 来帮助您查找内存问题。 【参考方案1】:

您可以通过检查其退出状态来检测它。这里是man bash

   The return value of a simple command is its exit status,  or  128+n  if
   the command is terminated by signal n.

由于kill -lSIGSEGV 显示为信号11,因此您可以运行程序直到它以139 退出:

until ./yourprogram; [ $? -eq 139 ]; do printf '.'; done

如果这是yourprogram.c:

#include <unistd.h>

int main()

  if(getpid()%100 == 0 ) 
    char* ptr = 1;
    *ptr = 1;
  
  return 0;

你会得到这样的结果(每个非段错误调用一个点):

............................Segmentation fault

【讨论】:

非常有用的脚本。我虽然坚如磐石的程序被证明是

以上是关于如何编写一个运行程序的 bash 脚本,直到它检测到信号 SIGSEGV、分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

Bash 脚本检测我的 USB 何时插入,然后将其与目录同步

如何从 bash 脚本并行运行多个程序?

如何检测 Python 是不是在 Git Bash 终端或 Windows cmd 中运行?

如何从 bash 脚本并行运行多个程序?

如何编写文本文件,然后在同一个 Bash 脚本中读取它?

如果进程死了,如何编写 bash 脚本来重新启动进程?