Я развертываю двоичный файл Rust на Windows 10, хотя исходный код должен соответствовать ОС c. Когда я запускаю тест дыма, который вызывает основную функцию моего ящика, он терпит неудачу:
In tests\main.rs
:
use std::process::Command;
use std::process::Stdio;
#[test]
fn my_test() -> Result<(), Box<dyn std::error::Error>> {
let mut cmd = Command::main_binary()?;
// Omitted some project specific code
cmd.stderr(Stdio::inherit()).stdout(Stdio::inherit()).unwrap();
}
Обратите внимание, что Command
из библиотеки assert_cmd
(версия 0.10
).
То же самое касается запуска файла .exe
в папке target
, который при вводе того же ввода, что и любой из моих других тестов, дает:
C:\path\to\project\target\x86_64-pc-windows-msvc\debug> my_project.ext -i path\to\vetted\output
started
starting memory_intensive_function
thread `main` has overflowed its stack
Основная функция, однако, не намного больше, чем тонкая оболочка, которая анализирует аргументы командной строки и затем внутренне вызывает некоторые функции:
In src\main.rs
pub fn main() -> Result<(), String> {
println!("started")
// parse command line arguments
println!("starting memory_intensive_function");
memory_intensive_function(/* command line arguments here */)?;
println!("completed memory intensive function");
}
Последний оператор print никогда ничего не печатает. Странно то, что у меня есть несколько тестов, всего 330, из которых 40 или около того напрямую вызывают memory_intensive_function()
, и все они работают нормально. Есть ли какое-то поведение в Rust, о котором я не знаю?
Я немного играл с идеей запуска memory_intensive_function()
в другом блокирующем потоке, но я не уверен, как это могло бы помочь.
Следует отметить, что существенное переписывание эта функция на самом деле не является опцией (хотя общие советы или рекомендации приветствуются).
tl; dr Многие тесты, которые вызывают функцию с интенсивным использованием памяти, работают нормально, но использование этой функции в main
вызывает ее CRA sh.