segmentation-fault 相关问题

访问不属于您的进程的内存时会发生分段错误。使用此标记以及指示语言的标记和指示操作系统的标记。分段错误通常是使用指针变量(通常包含无效地址)或缓冲区溢出的解除引用操作的结果。无效指针值的根本原因可能是远离产生分段错误的位置。

在这个简单的 C++ 线程程序中获取核心转储

我是 C++ 并发的新手。我只是尝试创建新线程并尝试运行它。 但我收到内存故障(coredump)错误。 现在可以找到导致内存故障的原因了。当我尝试...

回答 1 投票 0

返回后访问违规?我该如何调试这个?

我们的代码记录各种有意义的事件。通常日志记录工作得很好,但今天日志功能在返回时导致访问冲突。我猜堆已被某种方式损坏,但它......

回答 1 投票 0

没有 printf 核心,该段就被违反了

如果我不放置 printf(" "); 我有以下代码段被侵犯,否则工作正常 无效分散(浮点***plancha_ptr,浮点***copiaPlancha_ptr){ 浮动 **plancha = *

回答 1 投票 0

将动态分配数组的指针传递给 C++ 中的函数

我遇到了变量在内存中相互覆盖的问题,所以我决定尝试动态分配我的数组之一。 在下面的简化代码中,我尝试创建一个

回答 4 投票 0

C++ 合并排序分段错误?

我似乎在运行这个合并排序时遇到了一些麻烦。当我尝试使用 g++ 运行它时,终端显示“分段错误(核心已转储)”,我不知道是什么导致了这种情况

回答 2 投票 0

自动错误报告工具 (ABRT) 如何工作以在运行时捕获核心?

我的 fedora12 安装了一个名为 ABRT 的工具,可能是 GNOME 附带的。这 该工具在后台运行并实时报告任何崩溃的进程。 我已经使用了信号处理程序......

回答 2 投票 0

将参数传递给 main 时出现分段错误

我知道这有点基础,但我坚持这个。 我一直在尝试制作一款数独游戏。参数将通过将它们传递给主函数来给出。当尝试将它们写入不同的数组时,...

回答 1 投票 0

显示分段错误(核心转储)维吉尼亚密码

我正在为 cs50 做 pset,无论我做什么,它都会显示分段错误。 我尝试了各种东西,但它一直显示相同的东西。 这是我的维吉尼亚密码

回答 1 投票 0

使用数组下标时出现分段错误核心转储

我正在尝试实现一个相当基本的程序,但我得到了一个转储的核心。对我做错了什么有什么想法吗? #包括 整数 主要(无效){ char *number[] = {"一","t...

回答 2 投票 0

如何在 OS X Lion 上获取核心转储?

我正在使用 C 语言开发一个存在段错误的 PostgreSQL 扩展,因此我想查看我的 OS X Lion 机器上的核心转储文件。但是,/cores 或我能找到的其他任何地方都没有核心文件....

回答 1 投票 0

如何打开文件以在单独的函数中读取而不会出现分段错误?

当我在单个函数中打开文件时,它打开时没有错误。 无效文件打开(字符文件名[]){ 文件*文件; 文件 = fopen(文件名, "r"); 如果(文件!= NULL){ printf("成功

回答 1 投票 0

Delphi 11.2 Alexandria 中的 OWC11 - TPivotTable.Create 上的访问冲突

我们现在在创建 TPivotTable 类的实例时收到访问冲突。这在以前的 Delphi 版本中一直有效,没有问题。 重现步骤: 导入类型库...

回答 1 投票 0

用gdb查找memcpy错误

下面代码的错误是memcpy(t[j], m[j], sizeof(int) * DIM * DIM);应该是 memcpy(t[j], m[j], sizeof(int) * DIM);: // 无标题7.c #包括 #包括 以下代码中的错误是memcpy(t[j], m[j], sizeof(int) * DIM * DIM);应该是memcpy(t[j], m[j], sizeof(int) * DIM);: // Untitled7.c #include <stdio.h> #include <string.h> #define DIM 1000 int main(void) { int m[DIM][DIM], t[DIM][DIM]; unsigned j, k; for(j = 0; j < DIM; j++) for(k = 0; k < DIM; k++) m[j][k] = j * DIM + k; for(j = 0; j < DIM; j++) memcpy(t[j] ,m[j], sizeof(int) * DIM * DIM); // only one DIM for(j = 0; j < DIM; j++) for(k = 0; k < DIM; k++) m[j][k] = t[DIM-k-1][j]; return 0; } 使用 gdb 如何找到该错误?我了解了如何创建核心文件(使用ulimit -c unlimited),然后我使用了$ gdb Untitled7 core,它给出了: ... Reading symbols from Untitled7...done. [New LWP 10610] Core was generated by ` ? @ A'. // and symbols of binary files Program terminated with signal SIGSEGV, Segmentation fault. #0 __memcpy_ssse3 () at ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S:2590 2590 ../sysdeps/i386/i686/multiarch/memcpy-ssse3.S: File o directory non esistente. // File or directory not existent. 之后我该怎么办? 您不能总通过这种方式找到真正的错误,但您可以找到发生分段违规的位置。 您需要使用调试信息编译程序,最好不进行优化,即使用 -ggdb -O0 编译标志。如果违规发生在库函数内部(如您的示例所示),请使用 gdb 命令 up 向上移动调用堆栈,直到到达代码。然后您应该会看到程序的有问题的行。 确保gdb可以找到您的来源。通常当你的当前目录是你的构建目录时,gdb可以找到它们。如果没有,请使用 directory 的 gdb 命令。

回答 1 投票 0

分段错误(核心转储)C++ 初学者

所以,我是 C++ 新手。我研究了分段错误(核心转储)、内存分配和新建/删除,尽管我很难理解这些概念。我确实相信我的问题出在我...

回答 1 投票 0

尝试运行队列程序时出现分段错误(核心转储) - C++

每次尝试在 Linux 上使用 g++ 运行代码时,我都会收到分段错误(核心转储)错误。它编译得很好,但随后发生了这种情况...所有功能(删除、添加和打印)似乎...

回答 1 投票 0

子进程不生成核心文件

我有几个进程通过 init 系统运行。它们都是由进程 A 分叉的。 所以在我的初始化脚本中,我有这样的内容: ulimit -c 无限 cd /usr/bin/ && ./proc_A

回答 1 投票 0

访问结构时出现分段错误

程序会一直运行,直到检查用户输入的名称。当您输入要在从充满

回答 1 投票 0

c++ 分段错误(核心转储)错误[重复]

#包括 #包括 #包括 使用命名空间 std; string swapLastName(const string full_name, const string new_last_name) { 字符串名字; 字符串

回答 1 投票 0

使用双指针动态分配和初始化二维数组

我正在尝试动态创建一个 2D 数组(5 行和 2 列)。分配内存时没有任何问题。然而,在将实际值分配给数组时,我得到了一个段...

回答 1 投票 0

大型数组的分段错误(核心转储)[已关闭]

我是 C++ 编程新手,编写了以下 C++ 代码: //colpitts 高频 1 GHz,带延迟 #包括 #包括 #包括 #包括 我是C++编程新手,并且编写了这个C++代码: //colpitts high freq 1 GHz working with delay #include <iostream> #include <cmath> #include <string> #include <cstring> using namespace std; const double pi = 3.1415926; int main(){ double c0, dx, dt,C1,C2,L,fs,Ceq, freq, tau, Rload, gload, Re, ge,gm,gc1,gc2,ic1,ic2,il,gl ; c0=20000000000; dx=0.01; dt=dx/(2 * c0); cout<<dt<<"\n"; double V1 [1000000]={}; double V2 [1000000]={}; V1[0]=1e-3; C1=1e-12; C2=5e-12; L=30.4e-9; fs=4e12; Ceq=(C1 * C2)/(C1+C2); cout<<Ceq<<"\n"; freq=1/(2 * pi * (sqrt(L*Ceq))); cout<<freq<<"\n"; tau=1/freq; cout<<tau<<"\n"; Rload=50; Re=1e6; ge=1/Re; cout<<ge<<"\n"; gm=0; gc1=(C1)/dt; cout<<gc1<<"\n"; ic1=-((C1)/dt) * V1[0]; cout<<ic1<<"\n"; gc2=(C2)/dt; cout<<gc2<<"\n"; ic2=-((C2)/dt) * V2[0]; cout<<ic2<<"\n"; gl=dt/(L); cout<<gl<<"\n"; il=gl * (V2[0]-V1[0]); cout<<il<<"\n"; gload=1/Rload; cout<<gload<<"\n"; return (0); } 当我在Linux机器上运行它时,它会抛出分段错误(核心转储)的错误,但是当我将数组更改为100000时,不会抛出错误并且程序按预期执行。我知道问题出在分配给我的物理内存上,但是有办法解决吗?有人可以指导我需要进行哪些修改吗? 它是堆栈。您正在使用大约 16Mb 的堆栈来存储这两个双精度数组(每个双精度数 8 个字节 * 2 个数组 * 1,000,000)。 设置一个更大的堆栈,如下所示: ulimit -s 32000 确实解决了问题。但是将 16Mb 的数据块放入堆栈并不是一个好主意。 如果像这样将它们移出堆栈(并使用一些空行使代码更易于阅读:)),那么它就可以正常工作。不过,如上所述,我还建议您查看 vector 而不是使用 C 风格的原始数组: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027/C-Tutorial-A-Beginners-Guide-to-stdvector-Part-1.htm #include <iostream> #include <cmath> #include <string> #include <cstring> using namespace std; const double pi = 3.1415926; double V1 [1000000]={}; double V2 [1000000]={}; int main(){ double c0, dx, dt,C1,C2,L,fs,Ceq; double freq, tau, Rload, gload; double Re, ge,gm,gc1,gc2,ic1,ic2,il,gl ; c0=20000000000; dx=0.01; dt=dx/(2 * c0); cout<<dt<<"\n"; V1[0]=1e-3; C1=1e-12; C2=5e-12; L=30.4e-9; fs=4e12; Ceq=(C1 * C2)/(C1+C2); cout<<Ceq<<"\n"; freq=1/(2 * pi * (sqrt(L*Ceq))); cout<<freq<<"\n"; tau=1/freq; cout<<tau<<"\n"; Rload=50; Re=1e6; ge=1/Re; cout<<ge<<"\n"; gm=0; gc1=(C1)/dt; cout<<gc1<<"\n"; ic1=-((C1)/dt) * V1[0]; cout<<ic1<<"\n"; gc2=(C2)/dt; cout<<gc2<<"\n"; ic2=-((C2)/dt) * V2[0]; cout<<ic2<<"\n"; gl=dt/(L); cout<<gl<<"\n"; il=gl * (V2[0]-V1[0]); cout<<il<<"\n"; gload=1/Rload; cout<<gload<<"\n"; return (0); } 保罗 R 是对的。函数内声明的变量使用“堆栈”。局部变量可以使用的空间是有限制的。 他建议将这些本地数组声明设为全局、静态、动态分配,这意味着这些变量将不会使用堆栈空间。使用 STL 中的矢量也可以。 此链接可能会让您了解堆栈空间大小。 https://stackoverflow.com/a/1825996/3813353 一种快速而肮脏的解决方案是使用 limit/ulimit。缺点是您必须在运行程序之前使用此命令。简单地使数组全局变得更容易...... 通常,当你遇到堆栈大小问题时,是因为你有失控或无限递归。对递归函数的每次调用可能不会使用堆栈中的太多数据,但如果函数不断调用自身,您最终将耗尽堆栈空间。 确实,堆栈上的数据太多了。 您可以使用 std::vector 标准模板类(即使您在堆栈上分配向量,其数据也位于堆中)。因此,将 #include <vector> 添加到包含的标头中,然后编写类似 的代码 std::vector<double> v1, v2; v1.push_back(2.512); v1.push_back(3.17); v2.resize(37); v2[0] = v1[0] + v1[1]; v2[17] = sqrt(10.0) + 11.0; 阅读一些STL教程;顺便说一句,使用和学习 C++11(不是一些早期的 C++ 标准)。因此,请使用最新的编译器(例如 GCC 4.9,使用 g++ -std=c++11 -Wall -g.... 进行编译)并使用 gdb 调试器。

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.