Dosbox

Software potřebné k práci s elektronikou

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#286 Příspěvek od Valdano »

Kromě Vás dvou (Lesana a Asdf) se tady v tom už asi nikdo jiný nevyzná. :D

Možná se pletu, ale jestli jsem to pochopil správně z dosavadní diskuse tak Lesaně se ta chyba co se týče Wine projevuje v podstatě pořád zatímco u Asdf k tomu naopak nedochází vůbec a tak ten problém u sebe ani nedokáže zopakovat.

Pokud je někde v kódu ať už klienta nebo i některé části Wine chyba, která způsobuje hrábnutí někam do paměti procesu, tak to může způsobovat v rámci toho procesu chybu, která se může projevit v úplně jiné části kódu, která s tím místem kde je příčina ani nesouvisí (třeba i v nějaké zavedené knihovně atd.) téhož procesu. Hledání příčiny pak může být "never ending story".

Chtělo by to pro začátek dosáhnout toho, že se vám oběma podaří nasimulovat stejnou chybu při stejném volání určitého příkazu stejného klienta Wine, ale to by znamenalo mít totožné sestavení Linuxu na totožné HW i SW konfiguraci, protože na různých konfiguracích mohou probíhat různé části kódu a jelikož je chyba zřejmě v některé části, která probíhá jen u jednoho z vás tak se to pak u jednoho projevuje a u druhého s odlišnou konfigurací nikoli.

Pokud existuje možnost u vás obou nasimulovat a následně začít ten problém řešit ve stejném virtuálním stroji se stejnou virtuální HW konfigurací a stejným sestavením Linuxu i jeho SW konfigurací tak, že by obraz virtuálního stroje měl být mezi vámi oběma přenositelný pak by se vám mělo podařit dosáhnout toho, že bude u obou docházet ke stejné chybě při stejném volání určitého příkazu klienta Wine.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#287 Příspěvek od asdf »

Valdano: Ono je to právě blbý v tom, že se to projevuje jen na jednom počítači s Atomem 270. Identický (ve skutečnosti ten samý, protože na flešce) systém na jiném počítači s Atomem 280 funguje. A taky je zajímavé, že nefunguje prakticky žádná verze wine (myslím).
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#288 Příspěvek od lesana87 »

Zdá se, že jsi na to kápnul.
Naposledy upravil(a) lesana87 dne 26 led 2026, 19:18, celkem upraveno 1 x.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#289 Příspěvek od Valdano »

Pokud to Lesana zkouší jen na fyzickém počítači tak to může být způsobeno i jinou příčinou než jen Atomem 270. Může tam být i nějaká nešťastná kombinace s jiným HW a navíc ještě v kombinaci s nějakou třeba i dosud neodhalenou chybou SW, která se projevuje jen v určité kombinaci některých HW komponent a nemusí to být jen procesor. Chtělo by to dosáhnout zopakování té chyby ve virtuálním stroji, kde se dá zvolit jak typ procesu tak dalších HW komponent tak, že se to bude chovat u vás obou totožně.
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#290 Příspěvek od lesana87 »

No a o to se asdf pokouší, odhalit tu chybu.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#291 Příspěvek od Valdano »

Podle posledního výpisu dochází k výjimce dělení nulou na stejné adrese 7CD0FBDB i když v různých vláknech po sobě.

Debugger winedbg se dle chybového výpisu nepodařilo spustit ani v jednom z těch případů.

Otázkou tedy je jaký řádek zdrojáku odpovídá té adrese 7CD0FBDB?

Jestli je tam použito dělení a jako dělitel se bere hodnota nějaké dříve nastavené globální proměnné v paměti procesu, která mohla být poškozena alias přepsána na 0 nějakým "hrábnutím do paměti", které mohla způsobit úplně jiná část kódu, tak to bude chtít v různých voláních logovat hodnotu té globální proměnné a sledovat po jakém volání se její nenulová hodnota změní na nulovou.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#292 Příspěvek od asdf »

lesana87 píše:Zdá se, že jsi na to kápnul.
Fakt? Ale já to v tom logu nevidím.

Edit: Aha, už to vidím. To je právě blbý. Tohle se děje, když se spouští debugger. Takže jsme za tím dělením. Asi budeme hledat tu zprávu před tím, tj. 87.
Uživatelský avatar
Mahoney
Příspěvky: 759
Registrován: 26 říj 2019, 00:00

#293 Příspěvek od Mahoney »

Nevím jak to má Slackware atd, ale když chci provozovat 32bit appky, musím nainstalovat i wine32... nikdy jsem neměl žádný problém, vždy mi všechno fungovalo.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#294 Příspěvek od asdf »

Tohle na 32-bitovém systému.
Uživatelský avatar
Valdano
Příspěvky: 3117
Registrován: 01 led 2023, 00:00
Bydliště: Česká Lípa

#295 Příspěvek od Valdano »

Lesana už v předchozí části tohoto tématu psala, že má 32-bitovou verzi Wine.
lesana87 píše:$ locate kernel32.dll
/usr/lib/wine/i386-windows/kernel32.dll
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#296 Příspěvek od lesana87 »

Mahoney píše:nikdy jsem neměl žádný problém, vždy mi všechno fungovalo.
Štastný to člověk.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#297 Příspěvek od asdf »

Zkusil bych se chytit toho volani 182. To je zprava set_user_object_info a je jen na 3 mistech. Takze prosim doplnit do wine-10.0/dlls/win32u/winstation.c:
Kolem radky 661:

Kód: Vybrat vše

{
    BOOL ret;

    static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0};
    static const WCHAR window_stationW[] = {'W','i','n','d','o','w','S','t','a','t','i','o','n',0};

MESSAGE("pokus set_user_object_info winstation 1\n");
    switch(index)
    {
    case UOI_FLAGS:
        {
            USEROBJECTFLAGS *obj_flags = info;
            if (needed) *needed = sizeof(*obj_flags);
            if (len < sizeof(*obj_flags))
            {
Kolem radky 758:

Kód: Vybrat vše

    BOOL ret;
    const USEROBJECTFLAGS *obj_flags = info;

    if (index != UOI_FLAGS || !info || len < sizeof(*obj_flags))
    {
        RtlSetLastWin32Error( ERROR_INVALID_PARAMETER );
        return FALSE;
    }
MESSAGE("pokus set_user_object_info winstation 2\n");
    /* FIXME: inherit flag */
    SERVER_START_REQ( set_user_object_info )
    {
        req->handle    = wine_server_obj_handle( handle );
        req->flags     = SET_USER_OBJECT_SET_FLAGS;
        req->obj_flags = obj_flags->dwFlags;
        ret = !wine_server_call_err( req );
    }
A kolem radky 822:

Kód: Vybrat vše

        RTL_USER_PROCESS_PARAMETERS params = { sizeof(params), sizeof(params) };
        PS_ATTRIBUTE_LIST ps_attr;
        PS_CREATE_INFO create_info;
        WCHAR desktop[MAX_PATH];
        PEB *peb = NtCurrentTeb()->Peb;
        HANDLE process, thread;
        unsigned int status;

MESSAGE("pokus set_user_object_info winstation 3\n");
        SERVER_START_REQ( set_user_object_info )
        {
            req->handle = wine_server_obj_handle( NtUserGetThreadDesktop(GetCurrentThreadId()) );
            req->flags  = SET_USER_OBJECT_GET_FULL_NAME;
            wine_server_set_reply( req, desktop, sizeof(desktop) - sizeof(WCHAR) );
            if (!wine_server_call( req ))
            {
                size_t size = wine_server_reply_size( reply );
                desktop[size / sizeof(WCHAR)] = 0;
                TRACE( "starting explorer for desktop %s\n", debugstr_w(desktop) );
            }
            else
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#298 Příspěvek od lesana87 »

Něco tam přibylo, ale že bych z toho byla moudrá, to teda ne.
Přílohy
trace.zip
(7.76 KiB) Staženo 18 x
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#299 Příspěvek od asdf »

Takze se vola fce NtUserGetObjectInformation v wine-10.0/dlls/win32u/winstation.c. Trochu bych ji prospikoval logovanim, abychom vedeli, ze se vraci.

Kód: Vybrat vše

/***********************************************************************
 *           NtUserGetObjectInformation   (win32u.@)
 */
BOOL WINAPI NtUserGetObjectInformation( HANDLE handle, INT index, void *info,
                                        DWORD len, DWORD *needed )
{
    BOOL ret;

    static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0};
    static const WCHAR window_stationW[] = {'W','i','n','d','o','w','S','t','a','t','i','o','n',0};

MESSAGE("pokus set_user_object_info winstation 1\n");
    switch(index)
    {
    case UOI_FLAGS:
        {
            USEROBJECTFLAGS *obj_flags = info;
            if (needed) *needed = sizeof(*obj_flags);
            if (len < sizeof(*obj_flags))
            {
                RtlSetLastWin32Error( ERROR_BUFFER_OVERFLOW );
                return FALSE;
            }
            SERVER_START_REQ( set_user_object_info )
            {
                req->handle = wine_server_obj_handle( handle );
                req->flags  = 0;
                ret = !wine_server_call_err( req );
                if (ret)
                {
                    /* FIXME: inherit flag */
                    obj_flags->dwFlags = reply->old_obj_flags;
                }
            }
            SERVER_END_REQ;
        }
MESSAGE("pokus NtUserGetObjectInformation 1\n");
        return ret;

    case UOI_TYPE:
        SERVER_START_REQ( set_user_object_info )
        {
            req->handle = wine_server_obj_handle( handle );
            req->flags  = 0;
            ret = !wine_server_call_err( req );
            if (ret)
            {
                size_t size = reply->is_desktop ? sizeof(desktopW) : sizeof(window_stationW);
                if (needed) *needed = size;
                if (len < size)
                {
                    RtlSetLastWin32Error( ERROR_INSUFFICIENT_BUFFER );
                    ret = FALSE;
                }
                else memcpy( info, reply->is_desktop ? desktopW : window_stationW, size );
            }
        }
        SERVER_END_REQ;
MESSAGE("pokus NtUserGetObjectInformation 2\n");
        return ret;

    case UOI_NAME:
        {
            WCHAR buffer[MAX_PATH];
            SERVER_START_REQ( set_user_object_info )
            {
                req->handle = wine_server_obj_handle( handle );
                req->flags  = 0;
                wine_server_set_reply( req, buffer, sizeof(buffer) - sizeof(WCHAR) );
                ret = !wine_server_call_err( req );
                if (ret)
                {
                    size_t size = wine_server_reply_size( reply );
                    buffer[size / sizeof(WCHAR)] = 0;
                    size += sizeof(WCHAR);
                    if (needed) *needed = size;
                    if (len < size)
                    {
                        RtlSetLastWin32Error( ERROR_INSUFFICIENT_BUFFER );
                        ret = FALSE;
                    }
                    else memcpy( info, buffer, size );
                }
            }
            SERVER_END_REQ;
        }
MESSAGE("pokus NtUserGetObjectInformation 3\n");
        return ret;

    case UOI_USER_SID:
        FIXME( "not supported index %d\n", index );
        /* fall through */
    default:
        RtlSetLastWin32Error( ERROR_INVALID_PARAMETER );
MESSAGE("pokus NtUserGetObjectInformation 4\n");
        return FALSE;
    }
}
A zalogovat par mist, odkud se to muze volat. Treba v wine-10.0/dlls/user32/winstation.c:

Kód: Vybrat vše

/***********************************************************************
 *              GetUserObjectInformationA   (USER32.@)
 */
BOOL WINAPI GetUserObjectInformationA( HANDLE handle, INT index, LPVOID info, DWORD len, LPDWORD needed )
{
MESSAGE("pokus NtUserGetObjectInformation user32 winstation\n");
    /* check for information types returning strings */
    if (index == UOI_TYPE || index == UOI_NAME)
    {
        WCHAR buffer[MAX_PATH];
        DWORD lenA, lenW;

        if (!NtUserGetObjectInformation( handle, index, buffer, sizeof(buffer), &lenW )) return FALSE;
        lenA = WideCharToMultiByte( CP_ACP, 0, buffer, -1, NULL, 0, NULL, NULL );
        if (needed) *needed = lenA;
        if (lenA > len)
        {
            /* If the buffer length supplied by the caller is insufficient, Windows returns a
               'needed' length based upon the Unicode byte length, so we should do similarly. */
            if (needed) *needed = lenW;

            SetLastError( ERROR_INSUFFICIENT_BUFFER );
            return FALSE;
        }
        if (info) WideCharToMultiByte( CP_ACP, 0, buffer, -1, info, len, NULL, NULL );
        return TRUE;
    }
    return NtUserGetObjectInformation( handle, index, info, len, needed );
}
A treba wine-10.0/dlls/win32u/sysparams.c:

Kód: Vybrat vše

static BOOL lock_display_devices( BOOL force )
{
    static const WCHAR wine_service_station_name[] =
        {'_','_','w','i','n','e','s','e','r','v','i','c','e','_','w','i','n','s','t','a','t','i','o','n',0};
    struct device_manager_ctx ctx = {.vulkan_gpus = LIST_INIT(ctx.vulkan_gpus)};
    UINT64 serial;
    UINT status;
    WCHAR name[MAX_PATH];
    BOOL ret = TRUE;

    init_display_driver(); /* make sure to load the driver before anything else */

    pthread_mutex_lock( &display_lock );

    serial = get_monitor_update_serial();
    if (!force && monitor_update_serial >= serial) return TRUE;

    /* services do not have any adapters, only a virtual monitor */
MESSAGE("pokus NtUserGetObjectInformation sysparams\n");
    if (NtUserGetObjectInformation( NtUserGetProcessWindowStation(), UOI_NAME, name, sizeof(name), NULL )
        && !wcscmp( name, wine_service_station_name ))
    {
        clear_display_devices();
        list_add_tail( &monitors, &virtual_monitor.entry );
        set_winstation_monitors( TRUE );
        return TRUE;
    }

    if (!force && !update_display_cache_from_registry( serial )) force = TRUE;
    if (force)
    {
        if (!get_vulkan_gpus( &ctx.vulkan_gpus )) WARN( "Failed to find any vulkan GPU\n" );
        if (!(status = update_display_devices( &ctx ))) commit_display_devices( &ctx );
        else WARN( "Failed to update display devices, status %#x\n", status );
        release_display_manager_ctx( &ctx );

        ret = update_display_cache_from_registry( serial );
    }

    if (!ret)
    {
        ERR( "Failed to read display config.\n" );
        pthread_mutex_unlock( &display_lock );
    }
    return ret;
}
A jeste wine-10.0/dlls/win32u/driver.c:

Kód: Vybrat vše

static void load_display_driver(void)
{
    USEROBJECTFLAGS flags;
    HWINSTA winstation;

    if (!load_desktop_driver( get_desktop_window() ) || user_driver == &lazy_load_driver)
    {
        winstation = NtUserGetProcessWindowStation();
MESSAGE("pokus NtUserGetObjectInformation driver\n");
        if (!NtUserGetObjectInformation( winstation, UOI_FLAGS, &flags, sizeof(flags), NULL )
            || (flags.dwFlags & WSF_VISIBLE))
            null_user_driver.pCreateWindow = nodrv_CreateWindow;

        __wine_set_user_driver( &null_user_driver, WINE_GDI_DRIVER_VERSION );
    }
}
A asi posledni wine-10.0/dlls/win32u/winstation.c:

Kód: Vybrat vše

HWND get_desktop_window(void)
{
    static const WCHAR wine_service_station_name[] =
        {'_','_','w','i','n','e','s','e','r','v','i','c','e','_','w','i','n','s','t','a','t','i','o','n',0};
    struct ntuser_thread_info *thread_info = NtUserGetThreadInfo();
    WCHAR name[MAX_PATH];
    BOOL is_service;

    if (thread_info->top_window) return UlongToHandle( thread_info->top_window );

    /* don't create an actual explorer desktop window for services */
MESSAGE("pokus NtUserGetObjectInformation win32u winstation\n");
    if (NtUserGetObjectInformation( NtUserGetProcessWindowStation(), UOI_NAME, name, sizeof(name), NULL )
        && !wcscmp( name, wine_service_station_name ))
        is_service = TRUE;
    else
        is_service = FALSE;
...
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#300 Příspěvek od lesana87 »

Takovýho sraní a výslednej log je kratší než minule. 8O
Přílohy
trace.zip
(7.93 KiB) Staženo 14 x
Odpovědět

Zpět na „Software“