alpine linux 上的程序段错误。我该如何解决?

2024-02-06

我一直在用 C/C++ 开发 webrtc 数据通道库写了一个程序 https://github.com/hamon-in/librtcdcpp/blob/alpine-test/examples/websocket_client/2in1.c在 C 中:

  1. 从同一进程创建两个对等点。
  2. 建立它们之间的联系。
  3. 如果成功则关闭连接。

在 debian docker 容器和我的主机 opensuse tumbleweed (所有 x86_64 和 64 位)上一切都运行良好,但在 alpine linux 容器(64 位 x86_64)上,我在子进程内收到 SEGFAULT:

上面的函数来自程序的依赖项“libnice”。看起来 *agent == NULL 并且无法在caller's https://github.com/libnice/libnice/blob/fb2f1f77a31baa91968fc81c205f980b6913f403/agent/conncheck.c#L1893-L1916范围。我什至插入了一个printf("Argument is %p", agent);就在函数调用之前,它打印出它的内存,我可以验证它不为空。从反汇编来看,将代理的内容 (0x557a1d20) 复制为被调用者堆栈中的局部变量会导致段错误。即使在经过一段时间后,段错误也始终会发生在此时make clean和重新编译。激活记录失败?堆栈腐败?

UPDATE: I made a more lightweight container and ran it, and now it segfaults at a different place in that same priv_conn_keepalive_tick_unlocked. The argument seems to be set though (Notice the 0x7ffff7f9ad08): segfault2

因为我以为我可能会击中自由音乐的 https://wiki.musl-libc.org/functional-differences-from-glibc.html默认堆栈限制为 80k,我使用过getrlimit(RLIMIT_STACK, &rl)获取堆栈大小,看起来已经是 8 MB 而不是 80k。进一步增加此限制似乎没有任何区别,除了如果我分配超过 8 MB,我的程序会提前崩溃insideGDB。 Gdb 说它收到一个未知信号“??”;在 gdb 之外,它会在没有改变堆栈大小的情况下正常崩溃的正常点崩溃。

我不确定问题到底是什么(堆栈损坏?)以及下一步要做什么来解决这个问题。

这是我的程序流程:

对于创建的每个同级,都有一个孩子process是用 fork() 创建的。父 子通信由 ZeroMQ 完成,我使用协议缓冲区将子内部触发的任何回调(及其参数)转发到父进程中运行的事件循环上。

所以对于上面的程序,有2个子进程和1个父进程。

重现步骤:

  • 源文件:https://github.com/hamon-in/librtcdcpp/blob/alpine-test/examples/websocket_client/2in1.c https://github.com/hamon-in/librtcdcpp/blob/alpine-test/examples/websocket_client/2in1.c
  • 高山码头集装箱:https://github.com/hamon-in/librtcdcpp/blob/alpine-test/Dockerfile.amd64 https://github.com/hamon-in/librtcdcpp/blob/alpine-test/Dockerfile.amd64
  • 运行容器,二进制文件位于/psl-librtcdcpp/examples/websocket_client/2in1
  • 2in1 将产生两个子进程,这两个进程都会崩溃。

经过进一步调查,崩溃发生在距堆栈基址指针稍大的负偏移处写入的指令中,因此这可能只是一个简单的堆栈溢出。

解决此问题的正确方法是减少过多的堆栈使用或显式请求大堆栈pthread_create时间,但我不知道在哪里pthread_create正在被呼叫。快速检查以验证这是否是问题所在,方法是通过在程序早期的某处执行以下操作来覆盖新线程的默认堆栈大小:

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 1<<20); // 1 MB
pthread_setattr_default_np(&attr);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

alpine linux 上的程序段错误。我该如何解决? 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐