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

2016-01-28 11:08:40 +08:00
 XiaoxiaoPu
代码在这里 https://github.com/XiaoxiaoPu/muon ,功能 README.md 里有写,运行平台是 Linux/OS X 。现在的问题是,重构后使用 libmill 作为协程库,偶尔会出现段错误,有时十几分钟出现一次,有时几个小时出现一次。找了好久没找到问题。希望有大神能帮忙找到问题所在,或提供解决思路,多谢。
1737 次点击
所在节点    C
35 条回复
pagict
2016-01-28 11:21:24 +08:00
为什么不把 core dump 出来,用调试器看看
mzer0
2016-01-28 11:31:11 +08:00
你写的加密部分过于惨不忍睹。。。不要自己写加密算法,除非你是读数学的。。。

你的项目我没看完(代码质量也很惨不忍睹。。。), 先草率地下一个结论。可能你一直都是在 VPS 上跑的, VPS 的核心数不多,因此用 libmill 之前没遇到问题。用 libmill 以后容易产生读写一致性问题,简单地来说要加锁,但是你的程序是单线程设计,除非再重构一次。。。。。。
airqj
2016-01-28 11:43:59 +08:00
这种问题不出点血是没人义务给你解决的
zhczhy
2016-01-28 11:46:01 +08:00
mark ,晚上 review 下
XiaoxiaoPu
2016-01-28 11:55:23 +08:00
@mzer0 加密只是为了混淆,简单就好。 libmill 本身就是单线程、协程,不存在一致性问题。至于你说的代码质量惨不忍睹,能不能具体列举几点?
XiaoxiaoPu
2016-01-28 12:00:24 +08:00
@airqj 开源程序,有兴趣就开咯,没兴趣也不强求
airqj
2016-01-28 12:07:08 +08:00
哈哈 还以为是公司用的呢
抱歉
hitmanx
2016-01-28 12:38:45 +08:00
菜鸟一枚,晚上看看.core dump 里没啥有用的信息?
XiaoxiaoPu
2016-01-28 13:04:35 +08:00
@pagict
@hitmanx systemd 不知道怎么管理 coredump 的,没找到 coredump ,我再试试吧
mzer0
2016-01-28 14:10:11 +08:00
@XiaoxiaoPu

单线程仍然存在一致性问题, 我举个例子, 在 libmill 下, 如果你只有两个线程, 并且执行以下代码:

线程 A printf("%d",n); printf("%d",++n);
线程 B printf("%d", n); printf("%d", ++n);

你看到的输出很可能是: n(线程 A 输出), n(线程 B 输出), n+1(线程 A 输出), n+2(线程 B 输出).

这里你就会犯一个错误, 你认为 ++n 和 n 总是只差 1, 但实际上不是.
mzer0
2016-01-28 14:15:02 +08:00
@XiaoxiaoPu

说句不好听的, 代码质量差主要体现在你把几百行代码能实现的功能写了十几个文件, 并且一点卵用都没有.
XiaoxiaoPu
2016-01-28 14:19:40 +08:00
@mzer0 你要知道 libmill 是协程而不是线程,这意味着上下文切换不是任意时刻都会发生的,只有在 libmill 定义的 API 中才可能发生。你真的了解过 libmill 吗?还是主观臆测?
我认为按照功能把代码划分成文件有助于模块化,你不认同这种思想,那我也没办法。
Andiry
2016-01-28 14:23:00 +08:00
@mzer0 代码质量跟拆成多少个文件有个毛关系?要我说拆的多反而好,一看文件名就知道内容,清楚明了。

要真说有什么问题,那就是 ifdef 用的太多了, minilzo.c 这个文件简直没法读。
XiaoxiaoPu
2016-01-28 14:24:03 +08:00
skydiver
2016-01-28 14:25:26 +08:00
@XiaoxiaoPu coredumpctl
XiaoxiaoPu
2016-01-28 14:25:44 +08:00
@Andiry minilzo.c 是引用的一个 lzo 压缩库,不是我写的 http://www.oberhumer.com/opensource/lzo/
mzer0
2016-01-28 14:33:25 +08:00
@XiaoxiaoPu
@Andiry

1) 我说的不是文件拆分, 而是你代码本身写得太惨不忍睹, 类似于"说了一堆废话但实际上什么都没做", 本身功能很简单, 几百行代码(可能是三百, 或者两百)就实现了, 你弄了一堆什么用都没有的文件, 还扯上了 libmill......你项目都是建立在 ipconfig 之类的工具之上的, 那还不如直接写个脚本, 压根用不到 C 语言.

2) 不是我贬低你, 只是你根本不明白一致性问题, 说多了也白说......
XiaoxiaoPu
2016-01-28 14:43:23 +08:00
@mzer0 "你项目都是建立在 ipconfig 之类的工具之上的, 那还不如直接写个脚本, 压根用不到 C 语言",呵呵,你拿脚本写一个 ShadowVPN 这样的程序出来啊
mzer0
2016-01-28 14:51:09 +08:00
@XiaoxiaoPu 那我觉得我们不用继续交谈了, 并且主要原因在我个人看来是你的 C 语言水平过低, 并且无法接受批评.
XiaoxiaoPu
2016-01-28 14:59:15 +08:00
@mzer0 “弄了一堆什么用都没有的文件”,那你说说看,哪个文件是多余的没有用的?你说的都是莫名其妙的点,这我肯定无法接受。

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

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

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

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

© 2021 V2EX