在达到所有可能的组合之前,为什么会出现堆栈溢出?

时间:2016-07-04 11:52:32

标签: vb.net save stack-overflow brute-force

因此。 我在visual basic中制作了一个bruteforcer。 它有一个字符集,如下所示:

Dim charset as string
charset = "abcdefghijklmnopqrstuvwxyz1234567890."

有37种不同的字符吗?该程序用于搜索使用此charset制作的所有不同组合,最多包含3个不同的字母。例如

这是一个组合: ac6

因此,由于有37个字母和3个插槽,因此可能的组合为37 ^ 3

但是我希望我的程序不要尝试两次相同的组合。

因此它保存了在此位置尝试的每个组合(桌面)

Dim filex As System.IO.StreamWriter
            filex = My.Computer.FileSystem.OpenTextFileWriter("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt", True)
            filex.WriteLine(combination)
            filex.Close()

而且,在检查新组合的Sub的开头,我有这个

text = File.ReadAllText("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt")
index = text.IndexOf(combination) 'checks if it has been generated already
   If index >= 0 Then
       keyword() 'The sub
   End If

但经过一些组合(在这种情况下最大37 ^ 3~ = 50.000而我程序尝试了大约5200次)我得到了这个错误

mscorlib.dll中出现未处理的“System.StackOverflowException”类型异常

此错误指向此行代码

filex = My.Computer.FileSystem.OpenTextFileWriter("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt", True)

但为什么呢?在5200,仍然有44800种可能的随机组合,为什么我会出现溢出?

如果我在50000可能测试的50000组合中得到它会有意义,但现在我只有10%,所以为什么我会溢出?

1 个答案:

答案 0 :(得分:1)

您继续以递归方式调用keyword()方法。每次调用方法时,它的返回地址和可能的参数都被添加到调用堆栈中。 callstack只能在溢出之前接听一定数量的电话,而对于你的计算机和你的特定方法,这个数量似乎大约是5200。

您应该切换到使用例如While - 循环,并且每当您想要阻止执行的其余部分并返回到循环的开头时,您只需调用{{1 }}

还有一点需要注意的是,每次读/写时都不应该打开和关闭文件。而是将文件的内容存储在一个长字符串中(或者更好,在HashSet(Of T)中),并在每次需要时检查,然后在循环结束时将所有内容写入文件。

如果您仍希望在此过程中写入文件,请执行此操作。但是在循环开始之前打开一个流,直到循环结束,然后关闭流。