G-WAN是一种在Web上开箱即用的C代码的便捷方式,但对我来说它不适用于valgrind。 (运行valgrind ./gwan
会出现错误消息Inconsistency detected by ld.so: rtld.c: 1292: dl_main: Assertion `_rtld_local._dl_rtld_map.l_libname' failed!
,然后退出;系统是Debian Jessie 64位)。
问题是:
1)G-WAN是否应该与valgrind一起使用?
2)在G-WAN下运行的C代码中是否有其他可行的选项来检测内存错误?
答案 0 :(得分:1)
G-WAN是否应该与valgrind一起使用?
我们已经测试了Valgrind,虽然它做了很多事情,但它不适合高并发工作(即使低并发性也是Valgrind的问题)。
检测在G-WAN下运行的C代码中的内存错误的可行选项?
使用malloc()
包装器,预先分配的池,甚至更好,首先使用alloca()
来避免内存问题。
请注意,G-WAN处理C脚本中的错误指针而不会导致服务器崩溃,请参阅:http://gwan.ch/developers#crash
这个错误的代码:
int main(int argc, char *argv[])
{
strcpy(0xBADC0DE, 0xBADC0DE);
return 200;
}
...会产生类似以下'优雅'崩溃报告的内容:
Script: crash_libc.c
Client: 127.0.0.1
Query : ?crash_libc
Signal : 11:Address not mapped to object
Signal src : 1:SEGV_MAPERR
errno : 0
Thread : 0
Code Pointer: 0000f5200b33 (module:/lib/libc.so.6, function:strcpy, line:0)
Access Address: 00000badc0de
Registers : EAX=00000badc0de CS=00000033 EIP=0000f5200b33 EFLGS=000000010202
EBX=000000000001 SS=ec2d8ed4 ESP=0000f5ded828 EBP=0000f5dee020
ECX=000033323130 DS=ec2d8ed4 ESI=0000ec2d8f86 FS=00000033
EDX=000003b03c00 ES=ec2d8ed4 EDI=00000badc0de CS=00000033
Module :Function :Line # PgrmCntr(EIP) RetAddress FramePtr(EBP)
libc.so.6: strcpy: - 0000f5200b33 0000ec2d8f00 0000f5dee020
servlet: main: 37 0000ec2d8f00 00000042e10c 0000f5dee020
G-WAN甚至可以告诉您源代码中发生错误的位置(请参阅G-WAN crash_xxx.c示例),而不是杀死服务器进程。
如果您不想调试C代码,那么使用Java或Scala(均受G-WAN支持) - 您将需要更多内存,因为您的数据将保持加载状态,直到GC减慢所有内容以释放所有内容它认为可以被释放 - 但至少你将享受更少的与内存相关的错误,如果有的话。
根据提问的人的要求,这里有更多细节。
2012年末,我们测试了十几种免费和商业工具,像Valgrind一样,应该有助于调试并发性。我们还使用静态工具来研究源代码,而不仅仅是运行(编译)程序的动态工具。
可悲的事实是,他们都遇到了共同的问题,他们:
因此,经过数周的检查和过滤所有这些结果,我们花了很多时间“纠正”G-WAN代码库,以消除琐碎和错误的警报(由无法区分有效代码和错误的工具引起的警报代码)...但是,令我们感到沮丧的是,我们还没有在G-WAN中发现任何真正的错误(明确表示那些星期是浪费时间)。
因此上面的结论:尽可能尝试编写简单的代码,并在需要更复杂的策略时尝试预先分配块。
当然,Linux LIBC坚持用(不可捕获)abort
信号杀死应用程序这一事实无济于事(这会阻止程序恢复或转储相关跟踪),尤其是对于草率双重免费Linux LIBC检测(错误地假设当程序使用malloc()一次时所有代码都使用其malloc() - 这通常由LIBC调用完成!)。我甚至没有谈论mmap()失败,也没有谈论OOM kill-switch。
到目前为止,我们发现的唯一解决方案是避免使用Linux LIBC,并使用我们自己的C运行时编译所需的一切。对于所有用户来说,这有点难以推荐为“要做的事情”,但它对我们有用。
我们很高兴看到Linux使用的部分代码(或至少部分在G-WAN中实现的概念),因为这将使我们的生活(以及许多其他开发人员之一)变得非常容易,但我们过去与“负责人”的联系并不令人鼓舞。
总而言之,从操作系统,像我们这样的ISV和开发人员那里都有改进的空间 - 毕竟,自2004年以来,并发性是“唯一”的主流......差不多十年前。