segmentation-fault 相关问题

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

尝试运行队列程序时出现分段错误(核心转储) - 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

使用引用变量分配引用变量

我有一段 C++ 代码,它提供对私有成员变量的公共只读访问,如下所示: 类客户端{ 民众: const bool &connected = mConnected; // 提供只读访问...

回答 1 投票 0

以下声明和定义之间的区别

根据我的教科书, char *p = "你好"; 指向字符串的指针,其中字符串和指针都可以修改 const char *p = "你好"; 指向常量 str 的指针...

回答 1 投票 0

‘pop rbp’指令出现分段错误

以下汇编代码会导致在 pop rbp 指令处从主函数中退出分段错误。这段代码是由我正在编写的编译器生成的,所以不要介意多余的

回答 1 投票 0

下面代码出现段错误,错误在哪里?

代码: #包括 #包括 #包括 结构xsk_ring_stats { 无符号长 rx_frags; 无符号长 rx_npkts; 无符号长 tx_frags;

回答 1 投票 0

pop rbp 导致分段错误

以下汇编代码会导致在pop rbp指令处从主函数中退出分段错误(该代码是由我正在编写的编译器生成的,所以不要介意多余的

回答 1 投票 0

捕获崩溃子进程的“分段错误”消息:调用communicate()后没有输出和错误

我在使用子进程模块获取崩溃程序的输出时遇到问题。 我正在使用 python2.7 和子进程来调用带有奇怪参数的程序以获得一些段错误 在...

回答 3 投票 0

进行指针操作时出现分段错误(核心转储)

尝试运行程序时出现分段错误(核心转储)。只是一些简单的指针操作,但我无法弄清楚问题所在。 int get_address_value(int* ptr) { 返回*pt...

回答 2 投票 0

仅在启用 -O2 优化标志时出现段错误

我在一个较大的 C++ 应用程序中遇到了一个问题,该问题仅在启用优化 -O、-O2 或 -O3 时才会发生。我设法使用以下代码片段重现该问题: #包括 我在较大的 C++ 应用程序中遇到了一个问题,该问题仅在启用优化时才会发生 -O、-O2 或 -O3。我设法使用以下代码片段重现了该问题: #include <string> #include <memory> #include <fstream> #include <iomanip> #include <iostream> class PriceFeedStream { private: std::string trades_file_name = "example.csv"; std::ofstream output_trades_file; public: PriceFeedStream(const std::string& assetName){ std::cout << "trying to initialize " << std::endl; output_trades_file.open(trades_file_name, std::ios::app); if (!output_trades_file) { std::cerr << "failed to open file: " << trades_file_name << std::endl; return; } output_trades_file << assetName << std::endl; } }; int main(){ std::string asset = "ABC3"; std::cout << "initializing feed map with asset " << asset << std::endl; std::unique_ptr<PriceFeedStream> feed = std::make_unique<PriceFeedStream>(asset); std::cout << "done" << std::endl; return 0; } 应用程序在Windows上编译,使用编译器版本: g++.exe (MinGW-W64 x86_64-ucrt-mcf-seh, built by Brecht Sanders) 13.2.0 在没有任何优化标志的情况下编译时: g++ -g -Wall -Werror -Wextra -std=c++20 main.cc -o main 运行可执行文件的输出是: initializing feed map with asset ABC3 trying to initialize example.csv done 启用优化标志进行编译: g++ -g -Wall -Werror -Wextra -std=c++20 -O2 main.cc -o main 运行可执行文件时产生以下结果: initializing feed map with asset ABC3 Segmentation fault 我的猜测是代码可能有一些未定义的行为,导致在没有优化标志的情况下不会出现此段错误。我想了解这是什么类型的问题,以便在未来的情况下缓解。 这个问题确实与 @SamVarshavchik 提到的编译器的选择有关,不确定根本原因。我在同一台 Windows 机器上安装了 Clang/LLVM。 clang --version (built by Brecht Sanders) clang version 16.0.6 Target: x86_64-w64-windows-gnu Thread model: posix InstalledDir: C:/mingw64/bin 编译代码后 clang++ -g -Wall -Werror -Wextra -std=c++20 -O2 main.cc -o main 应用程序按预期执行: initializing feed with asset ABC3 trying to initialize done

回答 1 投票 0

分析堆栈损坏的核心转储

我目前正在尝试调试我的 C++ 应用程序中的核心。客户报告了带有以下线程列表的 SEGFAULT 核心: ...其他线程位于此处 3 线程 0xf73a2b70 (LWP 2120) 0x006fa43...

回答 3 投票 0

核心转储不起作用

当我运行带有段错误的程序时,我收到一条错误消息 Segmentation failure: 11。出于某种原因,我没有收到(核心转储)消息。我尝试运行 shell 命令 ulimit -c unlimited,...

回答 4 投票 0

程序收到信号SIGSEGV,分段错误 - 没有这样的文件或目录[重复]

我正在运行 gdb 来调试出现分段错误的程序。当我构建我的应用程序并运行时 gdb ./应用程序 我得到以下输出: 程序收到信号 SIGSEGV,分段错误。 __strcp...

回答 1 投票 0

Raspberry Pi 400 与 BME688 用于 bme ai studio 数据收集

我正在使用带有博世 BME688 传感器的 Raspberry Pi 400 来收集数据以传递到 BME Ai 工作室进行训练。我使用 pi3g github 库来收集数据。运行示例时一切......

回答 1 投票 0

在 SIGSEGV 之后映射未分配的内存

通过信号处理程序捕获 SIGSEGV 后,我尝试使用 mmap 来映射地址。我不明白为什么 mmap 因无法分配内存错误而失败。 这是 C 代码。我正在努力...

回答 1 投票 0

AddressSanitizer 随机抛出 SIGSEGV,没有任何解释

项目 我目前正在开发一个 C++ 游戏项目。 我使用 -g3 -std=c++2a -Wall ... -fsanitize=address -fsanitize=leak 编译每个源文件以检查泄漏和段错误 该...

回答 1 投票 0

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