如何编写一个运行程序的 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 -l
将SIGSEGV
显示为信号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 何时插入,然后将其与目录同步