Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么样的bug挂起了Linux?_C_Linux - Fatal编程技术网

C 什么样的bug挂起了Linux?

C 什么样的bug挂起了Linux?,c,linux,C,Linux,我试图调试一个简单的跨平台命令行程序(一个C解析器,本身是用C编写的),但遇到了一些奇怪的问题 在Windows上,当我在一个小数据集(glib的源代码)上运行它时,它会成功完成,而当我在一个大数据集(Linux内核的源代码)上运行它时,它会出现内存不足错误。我不确定后者是我代码中的一个bug,还是仅仅因为没有优化内存消耗,所以我一直在尝试在Linux上运行它,以便从valgrind那里得到一些反馈 在Linux(VirtualBox中的Ubuntu11.04 x64)上,当我在一个小数据集上运

我试图调试一个简单的跨平台命令行程序(一个C解析器,本身是用C编写的),但遇到了一些奇怪的问题

在Windows上,当我在一个小数据集(glib的源代码)上运行它时,它会成功完成,而当我在一个大数据集(Linux内核的源代码)上运行它时,它会出现内存不足错误。我不确定后者是我代码中的一个bug,还是仅仅因为没有优化内存消耗,所以我一直在尝试在Linux上运行它,以便从valgrind那里得到一些反馈

在Linux(VirtualBox中的Ubuntu11.04 x64)上,当我在一个小数据集上运行程序时,它会成功完成,而当我在一个大数据集上运行程序时,Linux锁得足够硬,我必须重置整个虚拟机(鼠标指针仍在移动,但除此之外,它完全没有响应;Windows任务管理器说虚拟机使用了100%的CPU核心,但没有分配内存)

除非我正在编写设备驱动程序之类的东西,否则我不会期望我的代码中有一个bug会使Linux崩溃。当我尝试分配太多内存、进入无限循环或两者兼而有之的简单测试用例时,Linux可以很好地处理它们。我应该寻找什么样的bug,或者我遗漏了什么

在Linux上(VirtualBox中的Ubuntu 11.04 x64)


可能您没有为虚拟机保留足够的内存。

这很可能是一个无限循环(很容易在解析器中完成),很容易占用100%的cpu或100%的ram

附加调试器

e、 g.
gdb

gdb
在Ubuntu上附带了
gcc

以下是操作指南:

编辑:刚刚看到您已经尝试了
gdb
。因此,尝试在其上运行
strace
,它可能会给您一个提示


除此之外,请尝试添加日志消息以查看程序运行到什么程度(基本,但它最终会工作!)

嗯……代码在哪里?您是否尝试过使用调试器?有大量的“bug”这可以做到。对我来说,最常见的是当RAM用完时,Linux切换到交换空间。在Windows上会出现错误,但在Linux上,您会开始将RAM写入磁盘以创建更多空间。问题是,磁盘I/O速度比RAM I/O速度慢得多。NickLH,当我尝试在gdb下运行时,我会得到相同的结果。它会运行一段时间在挂起之前,所以不能单步执行错误。Blender,奇怪的是,我得到了相反的结果-在Windows上,当我耗尽RAM时,机器可以在进入交换时锁定几分钟,但Linux只在几秒钟内杀死流氓进程。@rwallace在所描述的场景中Linux不运行本机,而是虚拟化。这可能会导致在这样一个场景中有一个区别。1GB。我很愿意相信这还不够,但当我编写一个malloc在无限循环中的小测试程序时,Linux会杀死它。是否有已知的情况下,程序内存不足会导致Linux挂起?无限循环肯定会发生,但是否有已知的原因在一个简单的测试程序中,这种行为与无限循环的行为会有很大的不同吗?是的,我试着在gdb下运行它,但结果相同,Linux挂起,^C(否则我会使用它返回调试器)什么都不做。我应该使用其他技术吗?我想这取决于在这个无限循环中执行的操作。您是否在调试器中逐步添加了断点?您至少应该能够隔离代码中开始出错的部分。strace很好。您也可以使用PID来strace运行程序。试试看(对于PID 1234)
strace-c-p 1234
,然后在几秒钟后按ctrl-c。它将打印一个摘要表-快乐的日子