我们发现自动生成的程序集之一在 new() 上抛出 StackOverflowException。这个类有(请耐心等待)400 多个简单属性,这些属性在构造函数中初始化(大多数默认为(字符串)等)。
我们注意到它在 64 位上运行良好,但在 32 位上运行却很糟糕!
我们需要测试我们的用例创建更大的默认堆栈是否合理,以便在重新设计代码生成器时为我们提供喘息空间。
我们尤其会。如果可能的话,对涉及 app.config 的解决方案感兴趣。但我是一个现实主义者,所以一切都会好起来的。
堆栈溢出的原因。我们已经将错误范围缩小到有问题的构造函数中。我的第一印象也是无限递归类型。不过,我们使用 3 行控制台应用程序重现了该错误:
当它击中第二个构造函数时,它会爆炸。
现在通过 .net 源代码进行调试,我们看到堆栈溢出位于 Guid.NewGuid() 中,它作为第二个参数传递给构造函数。实际的代码行是对本机 CoCreateGuid() 调用的调用。
因此,虽然这可能是 CoCreateGuid() 中的错误,但我们希望从问题中消除我们的代码。我的第一个想法是大幅增加堆栈的大小,看看这个错误是否再次发生。然后,由于我认为我们可以控制所有用例,因此用对象初始化替换构造函数 - 认为这可以减轻堆栈的压力。
铌。我们可以通过从类中仅删除 int 属性来阻止错误的发生。
堆栈溢出的 OCaml 堆栈跟踪被截断;例如,以下程序生成如下所示的堆栈跟踪:
\n\nlet rec f0 () = 1 + f1 ()\n and f1 () = 1 + f2 ()\n and f2 () = 1 + f3 ()\n and f3 () = 1 + f4 ()\n and f4 () = 1 + f5 ()\n and f5 () = 1 + f5 ()\n\nlet _ =\n Printexc.record_backtrace true;\n f0 ()\n
Run Code Online (Sandbox Code Playgroud)\n\nFatal error: exception Stack overflow\nRaised by primitive operation at file "stackoverflow.ml", line 6, characters 20-25\nCalled from file "stackoverflow.ml", line …
Run Code Online (Sandbox Code Playgroud) 我有如下数据类:
@Entity
@Table(name = "SECTIONS")
data class Section(
@Id @GeneratedValue
@Column(name = "ID")
var id: Long = 0,
@Column(name = "NAME")
var name: String = "",
@OneToMany(
mappedBy = "section",
fetch = FetchType.EAGER,
cascade = arrayOf(CascadeType.ALL),
orphanRemoval = true
)
var fields: MutableList<Field> = mutableListOf()
)
@Entity
@Table(name = "FIELDS")
data class Field(
@Id @GeneratedValue
@Column(name = "ID")
var id: Long = 0,
@Column(name = "NAME")
var name: String = "",
@ManyToOne
@JoinColumn(name = "SECTION_ID")
var section: Section? = null …
Run Code Online (Sandbox Code Playgroud) 我试图了解 Rust 中的堆栈溢出处理程序。recursive_stack()
我编写了一次又一次声明一些局部变量的函数以耗尽堆栈空间。
extern crate nix;
use nix::sys::signal;
extern "C" fn handle_sigsegv(_: i32) {
//Do something here
}
fn main() {
let sig_action = signal::SigAction::new(
signal::SigHandler::Handler(handle_sigsegv),
signal::SaFlags::SA_NODEFER,
signal::SigSet::empty(),
);
unsafe {
signal::sigaction(signal::SIGSEGV, &sig_action);
}
println!("Before function");
recursive_stack();
println!("After function");
}
fn recursive_stack() {
let _array: [i64; 50] = [0; 50];
recursive_stack();
}
Run Code Online (Sandbox Code Playgroud)
我想捕获信号并执行我的信号处理程序。如果我注册信号处理程序,我会收到“分段错误(核心已转储)”消息。如果我不注册信号处理程序,则会收到堆栈溢出消息。
如果我将其注册为信号,则该信号处理程序工作正常SIGINT
,但会给出奇怪的结果SIGSEGV
。我缺少什么?
我在 Ubuntu 18.04 上运行这个程序。
.NET Standard 2.1 引入了一项新功能,您可以在其中“控制”内存块而不是复制它们:Span或Memory。
在文档示例中,我注意到可以引用堆栈缓冲区:
byte data = 0;
Span<byte> stackSpan = stackalloc byte[100];
for (int ctr = 0; ctr < stackSpan.Length; ctr++)
stackSpan[ctr] = data++;
Run Code Online (Sandbox Code Playgroud)
据我所知,一个进程的堆栈内存是有限的(1MB 或 4MB),我们无法手动释放它。
所以我想创建一个Memory<T>
orSpan<T>
会以某种方式“固定”堆栈上的内存位置,以便我们可以索引它?但这不是可能导致堆栈溢出的堆栈泄漏的潜在情况吗?由于堆栈上的数组应该与Memory<T>
or一样长Span<T>
。
2019 年 7 月 31 日更新
该错误有时发生在 unstash 调用之前,但始终在同一台服务器上。为了查看问题是否是由于在需要覆盖文件的目录中进行 unstash 工作引起的,我清理了该目录——但问题仍然存在。这次开始输出(转录,任何错别字都是我的错):
Running on my_agent in C:/Jenkins/workspace/script_name
. . .
Running in D:\mydir
[Pipeline] {
[Pipeline] bat
[mydir] Running batch script
D:\mydir> dir .
<output of dir command>
[Pipeline] End of Pipeline
java.lang.StackOverflowError
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:115)
at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:778)
at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
etc.
Run Code Online (Sandbox Code Playgroud)
它没有到达 unstash 调用,但仍然出现相同的错误。
= = = = =
在 Windows 10 上的 Jenkins 中解压时出现 java.lang.StackOverflowError;发生在一台服务器上,而不是另一台服务器上。看起来 unstash 正在获得无限递归。
在 Linux 中,当正在运行的程序尝试使用超过限制的堆栈空间(堆栈溢出)时,通常会导致“分段错误”错误并中止执行。
是否保证超出堆栈空间限制总是会导致分段错误错误?或者程序是否会继续运行,但可能由于数据损坏而出现一些错误行为?
另一种说法是:如果一个程序行为不当,产生了错误的结果,但没有崩溃,那么原因仍然是堆栈溢出吗?
编辑:澄清一下,这个问题不是关于“堆栈缓冲区溢出”,而是关于堆栈溢出,当程序使用的堆栈空间超过堆栈大小限制(Linux 中由 给出的限制ulimit -s
)时。
调用 MongoDB 存储库接口的方法时出现 StackOverflowError:
public interface TermRepository extends MongoRepository<Term, String>, QuerydslPredicateExecutor<Term> {
// [...]
@Query("{$or:[{'apis' : {$in : ?0 } }, {$text:{$search:?1}}]}")
Page<Term> globalSearch(List<DBRef> apis, String searchKeyword, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)
apis
是一个只有一个 DBRef 的列表: new DBRef("api", new ObjectId("5e3ad9faaafa595898b6a682"))
searchKeyword
等于“账户”
pageable
是Page request [number: 0, size 37, sort: UNSORTED]
。如果size
是 36,它不会抛出 StackOverflowError!{
$or: [{
'apis': {
$in: [{
'$ref': 'api',
'$id': ObjectId('5e3ad9faaafa595898b6a682')
}]
}
}, {
$text: {
$search: 'account'
}
}]
}
Run Code Online (Sandbox Code Playgroud)
我有一个 android 应用程序,我经常通过 crashlytics (firebase) 看到以下异常。不幸的是,我不知道此错误发生在生命周期的何处,以及此异常是否对用户不利。我想知道这个异常发生在哪个交互以及我应该在我的代码中的哪个位置开始进行进一步分析。我的应用程序显示了包含路线和航点的 Google 地图。我使用带有位图的标记,它实现了某些功能。堆栈跟踪显示实例未正确处理 dispatchTouchEvent(),因此事件可能在循环中保持未处理状态,直到发生 StackOverflowError。我之前怀疑过 onMarkerClick() 方法,但我已经检查过它并确保正确处理和返回 true/false。你能帮我更好地找出原因吗?此处有关此主题的其他问题无法帮助我。
Fatal Exception: java.lang.StackOverflowError: stack size 8192KB
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.a.a(a.java:2)
at com.google.maps.api.android.lib6.impl.gesture.l.a(l.java:5)
at com.google.maps.api.android.lib6.impl.gesture.h.b(h.java:17)
at com.google.maps.api.android.lib6.impl.gesture.b.a(b.java:5)
at com.google.maps.api.android.lib6.gmm6.vector.ae.onTouchEvent(ae.java)
at android.view.View.dispatchTouchEvent(View.java:13503)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3073)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2766)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3073)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2766)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3073)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2766)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3073)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2766)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3073)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2766)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3073)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2766)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3073)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2766)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3073)
at …
Run Code Online (Sandbox Code Playgroud) 目前正在制作2023 年代码降临第 8 天的第二部分。我正在尝试以下解决方案:
main = readFile "8.txt" >>= print . proc . lines
proc (ds:_:xs) = step 1 ds m as ds where
m = (foldl' parse) M.empty xs
as = map (\x -> ((m ! x), False)) $ filter (\x -> (last x) == 'A') $ M.keys m
parse m s = M.insert n (l,r) m where
(n, ns) = splitAt 3 s
(l, ls) = splitAt 3 $ drop 4 ns
r = take 3 …
Run Code Online (Sandbox Code Playgroud)