Почему вызов функции Rust с интенсивным использованием памяти вызывает переполнение стека на Windows в основном, но не в тестах? - PullRequest
0 голосов
/ 03 марта 2020

Я развертываю двоичный файл 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.

...