使用段错误产生的核心转储文件进行调试


    当程序试图访问不允许访问的内存时就会发生段错误。这通常是因为程序中错误的使用指针造成,例如下面例子所示的对空指针的解引用。通常一个程序收到SIGSEGV信号的默认行为是非正常退出,这会终止这个进程,同时可能会产生核心转储core来帮助进行调试,或者产生其他一些和平台相关的行为。 核心转储 是某个计算机程序在特定的时刻计算机内存中的状态记录,通常是在该程序异常退出的时候产生。

下面的例子用来产生core文件。代码在bad()中解引用空指针,当我们运行时,会产生core文件。

/* bad.c */

int bad(int *pt)
{
  int x = *pt;
  return x;
}

int main()
{
  int *ptr = 0;   /* null pointer */
  return bad(ptr);
}

编译和运行:

$ gcc -g -o ./bad bad.c
$ ./bad
Segmentation fault
$ ls
bad  bad.c

可以看出core文件并没有产生,为了生成core文件,我们需要指定文件的大小:

$ ulimit -c
0
$ ulimit -c unlimited
$ ulimit -c
unlimited

再次运行:

$ ./bad
Segmentation fault (core dumped)
$ ls
bad  bad.c  core

现在 运行gdb 并用可执行文件名和core文件 作为参数:

<pre name="code" class="cpp">$ gdb ./bad core.2333
GNU gdb (GDB) Fedora (7.5.1-37.fc18)
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from /home/KHong/Work/Debug/bad...done.
[New LWP 2333]
Core was generated by `./bad'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000004004f8 in bad (pt=0x0) at bad.c:5
5	  int x = *pt;
(gdb) backtrace
#0  0x00000000004004f8 in bad (pt=0x0) at bad.c:5
#1  0x000000000040051e in main () at bad.c:12


 




段错误(core dumped)是指程序在执行过程中访问了无效的内存地址,导致操作系统将程序终止并生成一个核心转储文件(core dump)。这个文件可以用于调试程序,通过分析核心转储文件可以确定错误发生的位置和原因。通常情况下,段错误是由于以下几种情况引起的: 1. 野指针:当程序试图访问一个未初始化或已经释放的指针时,就会发生段错误。这通常是由于程序中的指针没有正确初始化或者指针指向的内存已经被释放导致的。 2. 数组越界:当程序试图访问数组中超出其边界的元素时,就会发生段错误。这通常是由于程序中的数组索引越界或者数组长度计算错误导致的。 3. 栈溢出:当程序的递归深度过大或者局部变量占用的栈空间超过了系统限制时,就会发生段错误。 4. 内存泄漏:当程序分配了内存但没有释放,导致内存耗尽时,就会发生段错误。 对于你提到的问题,下载CUDA时出现段错误(core dumped)的错误,可能是由于网络连接不稳定或者下载的文件损坏导致的。你可以尝试重新下载文件,或者使用其他下载方式。如果问题仍然存在,你可以尝试使用gdb等工具来分析核心转储文件,以确定错误的具体原因和位置。 #### 引用[.reference_title] - *1* [linux系统“s段错误 (核心转储)“错误解决的解决](https://blog.csdn.net/seaflyren/article/details/104131269)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Linux GCC下的“核心转储”](https://blog.csdn.net/gzbaishabi/article/details/36902343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值