为什么在达到所有可能的组合之前我会出现堆栈溢出?
Why do I get stack overflow BEFORE all the possible combinations have been reached?
所以。
我正在用 Visual Basic 制作一个暴力破解器。
它有一个字符集,如下所示:
Dim charset as string
charset = "abcdefghijklmnopqrstuvwxyz1234567890."
有37个不同的字符吧?该程序用于搜索使用此字符集进行的所有不同组合,最多 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 次)我得到这个错误
'System.WhosebugException' 类型的未处理异常发生在 mscorlib.dll
中
而这个错误点在这行代码
filex = My.Computer.FileSystem.OpenTextFileWriter("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt", True)
但是为什么呢?在 5200 时仍有 44800 种可能的随机组合,为什么我会溢出?
如果我在 50000 种可能的测试中有 50000 种组合时得到它会有意义,但现在我只有 10%,那为什么我会溢出?
你继续递归调用 keyword()
方法。每次调用方法时,它的 return 地址和可能的参数 is/are 都会添加到调用堆栈中。调用堆栈在溢出之前只能接受一定数量的调用,对于您的计算机和您的特定方法,该数量似乎约为 5200。
你应该改为使用 While
循环,每当你想阻止其余的执行并返回到循环的开头时,你只需调用 Continue While
.
还有一点要注意的是,您不应该在每次 read/write 时都打开和关闭文件。将文件的内容存储在一个长字符串中(或者更好,在 HashSet(Of T) 中)并在每次需要时检查,然后在循环结束时您可以将所有内容写入文件。
如果在此过程中您仍希望写入文件,请执行此操作。但是在你的循环之前打开一个流,你一直写入直到循环完成,然后关闭流。
所以。 我正在用 Visual Basic 制作一个暴力破解器。 它有一个字符集,如下所示:
Dim charset as string
charset = "abcdefghijklmnopqrstuvwxyz1234567890."
有37个不同的字符吧?该程序用于搜索使用此字符集进行的所有不同组合,最多 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 次)我得到这个错误
'System.WhosebugException' 类型的未处理异常发生在 mscorlib.dll
中而这个错误点在这行代码
filex = My.Computer.FileSystem.OpenTextFileWriter("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt", True)
但是为什么呢?在 5200 时仍有 44800 种可能的随机组合,为什么我会溢出?
如果我在 50000 种可能的测试中有 50000 种组合时得到它会有意义,但现在我只有 10%,那为什么我会溢出?
你继续递归调用 keyword()
方法。每次调用方法时,它的 return 地址和可能的参数 is/are 都会添加到调用堆栈中。调用堆栈在溢出之前只能接受一定数量的调用,对于您的计算机和您的特定方法,该数量似乎约为 5200。
你应该改为使用 While
循环,每当你想阻止其余的执行并返回到循环的开头时,你只需调用 Continue While
.
还有一点要注意的是,您不应该在每次 read/write 时都打开和关闭文件。将文件的内容存储在一个长字符串中(或者更好,在 HashSet(Of T) 中)并在每次需要时检查,然后在循环结束时您可以将所有内容写入文件。
如果在此过程中您仍希望写入文件,请执行此操作。但是在你的循环之前打开一个流,你一直写入直到循环完成,然后关闭流。