有没有用过 libmill 的童鞋或者 C 语言大神,求帮忙排查一个段错误的问题

2016-01-28 11:08:40 +08:00
 XiaoxiaoPu
代码在这里 https://github.com/XiaoxiaoPu/muon ,功能 README.md 里有写,运行平台是 Linux/OS X 。现在的问题是,重构后使用 libmill 作为协程库,偶尔会出现段错误,有时十几分钟出现一次,有时几个小时出现一次。找了好久没找到问题。希望有大神能帮忙找到问题所在,或提供解决思路,多谢。
1868 次点击
所在节点    C
35 条回复
stackpop
2016-01-28 15:09:49 +08:00
怎么这也能撕起来.

楼主同学, 建议你把报错的日志和 coredump 中的栈贴出来. 这样一些有经验的同学可以给你提供些建议, 帮助你 debug.

v2ex 看到个问题就去搭建环境编译, 还给你重现 core 的人, 应该很难碰到.

代码风格不算太大问题.
Andiry
2016-01-28 15:10:43 +08:00
@mzer0 没看出来楼主的代码哪里写的惨不忍睹了,除了莫名其妙的拿拆文件说事以外有没有点干货?贴两段代码论证一下也好啊。
stackpop
2016-01-28 15:12:26 +08:00
把出段错误的上下文, 各种变量, 以及被写坏的变量和地址都 print 出来, 一步步调试, 总能出来.
stackpop
2016-01-28 15:19:02 +08:00
另外赞一下楼上的"不要自己写加密算法, 除非你是学数学的".... 哈哈, 不知道哪里的自信得出这个结论.
mzer0
2016-01-28 15:19:32 +08:00
@XiaoxiaoPu 我只能告诉你, 我认为你写得很烂, 1)一部分代码不知道是哪儿抄来的, 2)莫名其妙的宏定义到处都是, 3)糟糕的封装, 4)几乎每一个函数都写得没有丝毫效率可言. 几乎每一个文件都可以被作为"错误编写的 C 语言代码"的范例, 你要我怎么评价? 你自己水平差, 写 C 语言写得少, 就不要拿自己花了很多时间写的糟糕透顶的项目去问别人"你看哪里糟糕了? 我花那么多时间写得我自我感觉挺好啊!".

自己水平怎样, 自己知道就好了, 想要提高, 就多写点程序, 不要拿到社区上让别人教你怎么写 C 语言, 要有自知之明, 对不对? 你想一想算一算你写过多少个小时的 C 语言程序, 就不要把自己当大师了, 好不好? 不然你等晚上大家下班了, 问问别人怎么评价你写的那个项目, 简直找不到一行写得好的代码......

不再回复此帖.
MiguelValentine
2016-01-28 15:25:08 +08:00
首先喷人我是不同意的,其次我懒的看 C 。有什么好吵的。 segment 的错误定位还是比较麻烦的- -。
XiaoxiaoPu
2016-01-28 15:29:59 +08:00
找到没有 coredump 的原因了,要生成 suid 程序的 coredump ,需要执行 sudo sysctl fs.suid_dumpable=1 才行
millken
2016-01-28 15:35:46 +08:00
所以我从不拿代码出来,知道自己会被喷!
abutter
2016-01-28 16:19:03 +08:00
coredump 堆栈回溯看一下问题出在哪先。
kezhuw
2016-01-28 16:28:48 +08:00
@XiaoxiaoPu 如果有多条可能的执行流,单线程仍然有并发问题,这点上 @mzer0 说的没错,“产生读写一致性问题,简单地来说要加锁”。这种情况应该叫 “重入” ?

你可以看看你的 `heartbeat` 以及 `udp_sender` 函数,`msleep` 和 `udpsend` 这两个地方都可能 yield 掉。多个 `udp_sender` 可能在 `encapsulate` 和 `memcpy` 这里产生 “一致性问题”,当然,这得看 `encapsulate` 做了些什么。不过,这应该可以说明问题了。

段错误的话,你可以试下 https://github.com/google/sanitizers/wiki/AddressSanitizer
XiaoxiaoPu
2016-01-28 16:58:38 +08:00
@kezhuw 非常感谢,我试试。我理解的,重入时如果只修改局部变量,那么不会有问题,这样可能问题在于 minilzo 在压缩时访问全局变量了,我在看下。再次感谢!
zhczhy
2016-01-28 21:22:32 +08:00
@XiaoxiaoPu
1. "minilzo.c" 这个是你自己写的还是从其他地方弄来的,这么多宏定义真的挺让人捉急
2. 你的代码规范性太差,基本的变量声明式初始化都没有。
3. 多数函数不要写成 static
4. vpn.c 文件中下面的宏定义改成 const 。
// 判断一个包是否重复
#define DUP_LEN 4093

你先把代码写规范吧,不然有些地方看起来真是困难。
XiaoxiaoPu
2016-01-28 21:35:53 +08:00
@zhczhy
1. http://www.oberhumer.com/opensource/lzo/
2. 很多变量紧接着就被赋值了,感觉没必要声明时就初始化。除此之外还有哪里规范性太差呢?
3. 只在本文件用到的函数为什么不写成 static ,万一跟其他文件的符号重名了怎么办?
4. DUP_LEN 是要作为数组长度的,改成 const 的话 gcc 会编译不通过
abutter
2016-01-29 13:20:35 +08:00
@XiaoxiaoPu lzo 线程安全吗?
XiaoxiaoPu
2016-01-29 14:30:46 +08:00
@abutter lzo 是线程安全的,问题已解决,与 lzo 无关。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/253938

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX