segmentation-fault 相关问题

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

Apache Avro C++ 段错误

我正在尝试使用 Avro C++ 库。我想创建一个 GenericDatum 实例,但使用以下代码时出现段错误。 avro_read.cc #包括 #包括 我正在尝试使用 Avro C++ 库。我想创建一个 GenericDatum 实例,但使用以下代码时出现段错误。 avro_read.cc #include <fstream> #include <avro/GenericDatum.hh> #include <avro/ValidSchema.hh> #include <avro/Compiler.hh> int main(int argc, char* argv[]) { // Read in and compile schema. std::ifstream in("schema.avsc"); avro::ValidSchema valid_schema; avro::compileJsonSchema(in, valid_schema); // Create a generic datum (segfaults). avro::GenericDatum datum(valid_schema); return 0; } CMakeLists.txt cmake_minimum_required(VERSION 3.20) project(repro CXX) find_package(unofficial-avro-cpp CONFIG REQUIRED) add_executable(avro_read avro_read.cc) target_link_libraries(avro_read PRIVATE unofficial::avro-cpp::avrocpp) vcpkg.json { "name": "segfault-repro", "version-string": "unversioned", "description": "A simple repro for the avro GenericDatum segfault", "dependencies": [ "avro-cpp" ] } 架构.avsc { "type": "record", "name": "__root__", "fields": [ { "name": "name", "type": [ "null", "string" ] }, { "name": "total", "type": [ "null", "long" ] } ] } 我使用 CMake 和 Vcpkg 进行编译以及以下命令: cmake -S . -B .build -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_TOOLCHAIN_FILE=$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake cmake --build .build .build/avro_read 我尝试运行gdb(gdb .build/avro_read,但没有得到任何有用的东西 Program received signal SIGSEGV, Segmentation fault. 0x00005555555ecd70 in ?? () (gdb) bt #0 0x00005555555ecd70 in ?? () #1 0x000055555556b46d in main () 然后我就跑了valgrind --leak-check=full .build/avro_read ==2398834== Memcheck, a memory error detector ==2398834== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al. ==2398834== Using Valgrind-3.20.0 and LibVEX; rerun with -h for copyright info ==2398834== Command: .build/avro_read ==2398834== vex amd64->IR: unhandled instruction bytes: 0xF1 0x60 0x3E 0x0 0x0 0x0 0x0 0x0 0x10 0x7F vex amd64->IR: REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0 vex amd64->IR: VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=NONE vex amd64->IR: PFX.66=0 PFX.F2=0 PFX.F3=0 ==2398834== Invalid read of size 1 ==2398834== at 0x4DC7EC0: ??? ==2398834== by 0x4DC60DF: ??? ==2398834== by 0x7: ??? ==2398834== Address 0x1b is not stack'd, malloc'd or (recently) free'd ==2398834== ==2398834== ==2398834== Process terminating with default action of signal 11 (SIGSEGV) ==2398834== Access not within mapped region at address 0x1B ==2398834== at 0x4DC7EC0: ??? ==2398834== by 0x4DC60DF: ??? ==2398834== by 0x7: ??? ==2398834== If you believe this happened as a result of a stack ==2398834== overflow in your program's main thread (unlikely but ==2398834== possible), you can try to increase the size of the ==2398834== main thread stack using the --main-stacksize= flag. ==2398834== The main thread stack size used in this run was 8388608. ==2398834== ==2398834== HEAP SUMMARY: ==2398834== in use at exit: 84,688 bytes in 40 blocks ==2398834== total heap usage: 123 allocs, 83 frees, 97,888 bytes allocated ==2398834== ==2398834== LEAK SUMMARY: ==2398834== definitely lost: 0 bytes in 0 blocks ==2398834== indirectly lost: 0 bytes in 0 blocks ==2398834== possibly lost: 0 bytes in 0 blocks ==2398834== still reachable: 84,688 bytes in 40 blocks ==2398834== suppressed: 0 bytes in 0 blocks ==2398834== Reachable blocks (those to which a pointer was found) are not shown. ==2398834== To see them, rerun with: --leak-check=full --show-leak-kinds=all ==2398834== ==2398834== For lists of detected and suppressed errors, rerun with: -s ==2398834== ERROR SUMMARY: 2 errors from 1 contexts (suppressed: 0 from 0) [1] 2398834 segmentation fault valgrind --leak-check=full .build/avro_read 更新: avro 代码包含 any/boost any,具体取决于 C++ 版本。 https://github.com/apache/avro/blob/e932c9453be7b36e8874fe92edb3710beef4e47c/lang/c%2B%2B/api/GenericDatum.hh#L27-L31. #if __cplusplus >= 201703L #include <any> #else #include "boost/any.hpp" #endif 当我使用 C++ 14 编译时,没有出现段错误: set (CMAKE_CXX_STANDARD 14) 但是当我使用 C++ 17 或 C++20 时,我会出现段错误 set (CMAKE_CXX_STANDARD 17) 我认为 any_cast 之一是在 nullptr 和段错误上调用的。 我将使用 C++ 14,它编译时不会出现段错误。

回答 1 投票 0

Valgrind (C):进程以信号 11 (SIGSEGV) 的默认操作终止

我正在用 C 语言做一个关于 AVL 树的学校项目。代码出现以下错误。它编译得很好,但由于分段错误(核心转储)而终止。 ==210456== 无效区域...

回答 1 投票 0

当通过引用传递给函数时,整数数组似乎会自行释放

我正在尝试制作一个opengl程序。我制作了一些文件来抽象它的一些功能。这是我的代码: VAO_t vao[2]; // 第一个多边形 vaoGen(&vao[0]); vaoBind(&...

回答 1 投票 0

fread() 正在读取错误的数据,即使之前的块已正确读取

背景: 我正在尝试从 .goo 文件(Elegoo Mars 4 的 SLA 打印机文件格式)解析图层信息。 3D 模型的每一层都编码在存储在 goo_layer_definit 中的新二进制文件块中...

回答 1 投票 0

在Android设备中打开应用程序后,Kivy应用程序致命信号11(SIGSEGV),代码1(SEGV_MAPERR),tid 10919(SDLThread)中的故障地址0x40

致命信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR),tid 10919 (SDLThread) 中的故障地址 0x40,pid 10882 (org.test.myapp) 这是 logcat 的最后一行,我真的对发生的事情一无所知,因为......

回答 2 投票 0

快速排序分段错误

我用 C 实现了快速排序算法,并且在元素少于 30000 个的向量中正常工作。但是,它出现了分段错误 排队 if (vet[sup]>vet[sup/2+1]){交换(&vet[sup], &a...

回答 1 投票 0

Crypto++ ECDSA<ECP, SHA256>::PrivateKey::初始化造成分段错误

我有一个程序可以初始化 ECDSA 密钥对并存储它们。该程序有效,但现在,我在使用 Crypto++ 库初始化 ECDSA 私钥时出现分段错误。 这是

回答 1 投票 0

为什么这段代码会导致分段错误?

我有以下代码在 C++ 中打印向量。它适用于非空向量,但由于某种原因,当您尝试打印空向量时,它会出现分段错误。 #包括 我有以下代码来在 C++ 中打印向量。它适用于非空向量,但由于某种原因,当您尝试打印空向量时,它会出现分段错误。 #include <iostream> #include <vector> using namespace std; void printVector(const vector<int>& v) { cout << "{"; for (int i = 0; i < v.size() - 1; i++) cout << v[i] << ", "; if(v.size() > 0) cout << v[v.size() - 1]; cout << "}" << endl; } int main() { vector<int> v = vector<int>(0); printVector(v); } 对于空向量v,v.size() = 0,因此v.size() - 1 = -1,不> 0,因此永远不会进入循环。 if 条件也是如此。因此,唯一应该执行的两行是打印“{”和“}的行 ”. 相反,此代码输出准确(它甚至不打印第一个“{”): Segmentation fault (core dumped) 然后我尝试在代码中添加更多的计算,看看它在哪里中断。我做的第一个修改是 void printVector(const vector<int>& v) { cout << "{"; cout << "Check 1" << endl; for (int i = 0; i < v.size() - 1; i++) cout << v[i] << ", "; if(v.size() > 0) cout << v[v.size() - 1]; cout << "}" << endl; } 现在输出: {Check 1 Segmentation fault (core dumped) 这很奇怪,因为现在“{”确实出现了。我的下一个猜测是,.size() 函数可能会给出空向量的错误,因此 for 循环条件才是破坏的原因。为了测试它,我做了以下修改: void printVector(const vector<int>& v) { cout << "{"; int aux = v.size(); cout << "Check 1" << " " << aux << endl; for (int i = 0; i < v.size() - 1; i++) cout << v[i] << ", "; if(v.size() > 0) cout << v[v.size() - 1]; cout << "}" << endl; } 输出: {Check 1 0 Segmentation fault (core dumped) 我的结论是问题不可能出在 .size() 函数上,这是我对问题所在的最后猜测。然后我问聊天 gpt,它给了我这个代码: void printVector(vector<int>& v) { cout << "{"; for (int i = 0; i < v.size(); i++) { cout << v[i]; if (i < v.size() - 1) { cout << ", "; } } cout << "}" << endl; } 出于某种原因,这有效!对我来说,它看起来是完全相同的代码。我觉得我快要疯了。这是一个如此简单的程序,我什至无法让它工作/找到错误。 v.size() 是无符号。根据语言规则,无符号减去某个整数值的结果也是无符号的。 因此,当vector为空时,v.size()-1不是-1,而是它的无符号等价物,它(以2s补码表示)是一个大的正值(在典型的64位平台上它将是2^64-1)即 18,446,744,073,709,551,615)。 因此,您的 for 循环相当于: for (int i = 0; i < a_large_positive_integer; i++) 并且在第一次迭代中尝试访问 v[0],这是超出范围。 因此出现分段错误。 size() - 1 使用 无符号 整数,并且由于 size() 是 0,结果将回绕并成为可能的最大 size_t。 另一种方法是检查 vector 是否非空,然后打印第一个值,然后打印其余的值,前面加上 ,: void printVector(const std::vector<int>& v) { std::cout << '{'; if (!v.empty()) { auto it = v.begin(); std::cout << *it; for (++it; it != v.end(); ++it) { std::cout << ", " << *it; } } std::cout << "}\n"; }

回答 2 投票 0

如果使用数组,析构函数中会出现分段错误

清理向量时出现我无法理解的分段错误。删除数组访问(从底部第三行)可以消除崩溃,即使崩溃不在该行上。 代码...

回答 1 投票 0

霍夫曼代码在随机输入时出现段错误,但在文本输入时不会出现

(我在这里对霍夫曼代码的实现提出了多个问题,如果我问太多问题,请告诉我,我会停止。有关如何自己学习发现这些错误的任何提示是

回答 1 投票 0

在 c 中实现二叉树时出现分段错误

我是c语言新手,但对于一个项目,我正在实现一个二叉树。这是我的函数代码: #包括 #包括 #包括 typedef 结构 BST...

回答 1 投票 0

C++ 访问向量的向量出现分段错误

我创建了一个向量(10*10000)的向量,并尝试通过成员函数访问这个向量。但我遇到了分段错误。我不知道这里出了什么问题... 这是 Simple.h 简单类 { 优先...

回答 2 投票 0

检查评估地址是否会导致段错误而不导致 python 崩溃

我尝试过的: 错误处理程序对于获取发生段错误的回溯非常有用,但它不允许正确处理它。 导入故障处理程序 故障处理程序.enable() 导入ctypes 尝试: ...

回答 1 投票 0

尝试构建单个链接列表时,分段核心被转储

我正在学习C语言中的链接列表概念,因为我正在构建一个可以创建单个逆序列表的项目,我遇到了一次又一次转储的分段代码。请帮我找到我的电子...

回答 1 投票 0

在 Rust 中调用使用 dlopen() 获得的函数指针时出现段错误

我目前正在使用 Rust 使用 dlfcn.h 中定义的 POSIX 函数,目的是调用单独的 .so 文件中的函数。 该项目实际上包含 2 个 crate: 二进制文件加载

回答 1 投票 0

反转数组的代码中存在分段错误

#包括 使用命名空间 std; int main(){ 整数n,i,j; int arr[n]; 辛>>n; 对于 (j = 0; j < n; j++) { cin >> arr[j]; } for (i = n+1; i >=0; i--) { 算了...

回答 1 投票 0

C 内存访问错误分段故障 -

uint32_t binDataSize = 0; void *binData =Snapshot_Recovery(argc, argv, &binDataSize); snapshot_header *snapPtr = (snapshot_header *)malloc(binDataSize); printf("bindataSize 为 %u &quo...

回答 1 投票 0

C++ 程序的段错误

每当我尝试输入电影描述的名称或与字符串条目相关的任何其他内容时,它总是出现段错误。我可以输入电影的名称和类型。 #include“spla...

回答 1 投票 0

vscode 未运行并出现分段错误

刚刚将 vscode 1.23.1 更新为 1.27.2 我无法打开表单菜单,因此我尝试从终端显示分段错误。 /usr/bin/code:第 35 行:8228 分段错误(核心已转储)

回答 3 投票 0

令人困惑的回溯表明存在不符合预期的递归调用

我的程序很少发生崩溃,只有在触发STR时才会偶尔发生(STR是在QNX OS中暂停程序并恢复程序)。以下回溯令人困惑......

回答 1 投票 0

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