A Bug

今晚花了8个小时1杯咖啡调试sgos2一个bug,最终还是解决了。

在时间消耗上很不划算,不过总算学到东西。

昨晚出现了一个怪问题,尽管我把代码改了又改,还是不知道问题出在哪里。怪问题如下:

我开始怀疑是printf里面溢出了。但是printf经历了那么多次考验,不会有问题的呀。我再想想我之前修改了什么,后来发现是在堆栈上申请了一个buf[4096],我把长度改为1024时没问题。为何会这样呢?

用了各种方法调试,还是很无奈。

到了夜深人静的时候,突然发现反汇编上的alloca函数,这时我才意识到它的作用。

原来,在堆栈上申请大内存,使用的就是这个函数,而当时我写crt的时候忽略了,只是假惺惺地:

extern “C” void _alloca()

{

}

什么事情都没有做。

后来在网上查了一下这个函数需要做的工作,写了以下代码,解决问题!

/*
The better way to do this is to touch every page
while we decrement the stack pointer.
Note: gcc will store the size in eax.
*/
.global __alloca
__alloca:
pushl %edx
movl %esp, %edx
addl $0x8, %edx
subl %eax, %edx
movl %esp, %eax
movl %edx, %esp
movl (%eax), %edx
movl 4(%eax), %eax
jmp *%eax

等待解决问题的时候,我已经把代码改得一团糟了。

现在startup.xml也不用了,用startup.txt,里面的每一行代表一个需要启动的程序。悲剧!

给截图:

A Bug》有7个想法

  1. Xiaoxia

    通常,我也是在写算法的时候,才用i j k m n的字母变量名。
    在写sgos2的代码中,很少这样做,因为可读性不好。

    回复

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据