c-高山linux上的程序段错误.我该如何解决?

我一直在C/C++和wrote a program C中开发一个webrtc数据通道库,以:

>通过相同的过程创建两个对等体.
>在它们之间建立连接.
>如果连接成功,则关闭连接.

在debian docker容器上和我的主机opensuse tumbleweed(所有x86_64和64bit)上,一切运行良好,但是在高山linux容器(64bit x86_64)上,子进程内部出现SEGFAULT:

c-高山linux上的程序段错误.我该如何解决?

上面的功能来自程序的依赖项“ libnice”.似乎* agent == NULL,并且在caller’s范围内无法将其设置为null.我什至插入了printf(“ Argument is%p”,agent);就在函数调用之前,它会打印出它的内存,我可以确认它不为null.从反汇编中,看起来像是一行代码,其中复制代理的内容(0x557a1d20)作为被调用者堆栈中的本地变量会导致段错误.即使在进行清理和重新编译后,此段错误始终会在此时发生.激活记录失败?堆栈损坏?

更新:我制作了一个更轻巧的容器并运行了它,现在它在同一个priv_conn_keepalive_tick_unlocked中的另一个位置进行段错误修复.该参数似乎已设置(请注意0x7ffff7f9ad08):
c-高山linux上的程序段错误.我该如何解决?

因为我以为我可能会达到libmusl’s的默认堆栈限制80k,所以我使用getrlimit(RLIMIT_STACK,& rl)来获取堆栈大小,看起来已经是8 MB而不是80k.进一步增加此限制似乎没有任何区别,除了如果我分配的内存超过8 MB,我的程序会在Gdb中提前崩溃. Gdb表示收到未知信号“??”;在gdb外部,它会在正常情况下崩溃,而正常情况下该崩溃通常不会更改堆栈大小.

我不确定到底是什么问题(堆栈损坏?)以及下一步如何解决此问题.

这是我程序的流程:

对于创建的每个对等方,都会使用fork()创建一个子进程.父母<->子通信由ZeroMQ完成,我使用协议缓冲区将在子内部触发的所有回调(及其回调)转发到在父进程中运行的事件循环.

因此,对于上述程序,有2个子进程和1个父进程.

重现步骤:

源文件:https://github.com/hamon-in/librtcdcpp/blob/alpine-test/examples/websocket_client/2in1.c
>高山Docker集装箱: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);
上一篇:alpine基础镜像使用


下一篇:linux-如何将凭据烘焙到git的docker映像中?