egui icon indicating copy to clipboard operation
egui copied to clipboard

Unhandled user callback exception on dynamic library interaction

Open CrazyboyQCD opened this issue 1 year ago • 3 comments

Describe the bug When use dynamic library to render, clicking the exit button the application stop for seconds and exit with error.

To Reproduce Steps to reproduce the behavior: main.rs:

use eframe::egui::{self, Context};
use eframe::{App, Frame};
use libloading::{Library, Symbol};
use std::fs;

pub struct Program {
    libs: Vec<Library>,
}

impl Default for Program {
    fn default() -> Program {
        let plugins = fs::read_dir("libs/").expect("no plugins folder!");
        let mut libs = vec![];
        for plugin in plugins {
            unsafe {
                let path = plugin.unwrap().path();
                let lib = Library::new(path).expect("couldn't find dll");
                libs.push(lib);
            }
        }
        Self { libs }
    }
}

impl App for Program {
    fn update(&mut self, ctx: &Context, _frame: &mut Frame) {
        for lib in &self.libs {
            unsafe {
                let func: Symbol<unsafe extern "C" fn(&Context)> = lib.get(b"render").unwrap();
                func(ctx);
            }
        }
        egui::SidePanel::right("main").show(ctx, |ui| {
            ui.heading("My egui Application Main");
        });
    }
}

fn main() {
    let options = eframe::NativeOptions {
        viewport: egui::ViewportBuilder::default().with_inner_size([320.0, 240.0]),
        ..Default::default()
    };
    eframe::run_native(
        "My egui App",
        options,
        Box::new(|_cc| Ok(Box::<Program>::default())),
    )
    .unwrap();
}

lib.rs:

use eframe::egui;
use eframe::egui::Context;

#[no_mangle]
pub fn render(ctx: &Context) {
    egui::SidePanel::left("dll").show(ctx, |ui| {
        ui.heading("My egui Application dll");
    });
}

Expected behavior Exit normally.

Screenshots image

Desktop (please complete the following information):

  • OS: Windows11

Additional context Error appears on both Glow and wgpu backend. Both panic before dropping painter. Eframe version: 0.28.1 Error 0xc000041d exists when exception isn't handled in windows' user callback.

CrazyboyQCD avatar Sep 24 '24 10:09 CrazyboyQCD

The render function in lib.rs is not defined as extern "C" but it is imported as one, which might result in the calling convention mismatching.

valadaptive avatar Oct 02 '24 17:10 valadaptive

The render function in lib.rs is not defined as extern "C" but it is imported as one, which might result in the calling convention mismatching.

It made no difference in my test. And I have something more from debugger(sorry for the pic reading but I don't know how to dump it in vscode) : image image image And it seem like a deallocation problem here (in the first pic it started from egui::memory::Memory when dropped IdTypeMap)~~, may be it is caused by using Arc in dll(wait for more test)?~~

CrazyboyQCD avatar Oct 10 '24 00:10 CrazyboyQCD

In 0.29.1, after using mimalloc and applying -Zbuild-std=core,std, allocation issue is toward to LayoutJob's text's dropping, and it seems like a double-free problem? image

image

CrazyboyQCD avatar Oct 15 '24 09:10 CrazyboyQCD