Bonjour à tous!
Après si longtemps loin de nos chers forums, me voici de retour avec un problème assez coriace.
J'ai un programme pour Windows qui fonctionne bien en temps normal:
- Son manifeste exige les droits d'administrations, et windows s'assure qu'il soit lancé avec.
- Son IHM Qt s'affiche, je peux intéragir avec,
- L'accès au périphérique usb essentiel au travail se fait correctement,
- etc
Quand j'ouvre une console admin et le lance directement, sans argument, tout se passe bien.
Par contre, si je le lance dans un gdbserver, je rencontre une segfault systématiquement, et avant main.
Je sèche complètement, sans une once de piste. Auriez-vous une idée?
Un peu de contexte plus précis.
Le soft est compilé pour un windows 10, mais depuis un environnement docker linux: un ubuntu 20.04 avec entre autre les paquets officiel mingw et gdb-mingw-w64 et gdb-mingw-w64-target.
La compilation est pilotée par CMake,
Qt est compilé en bibliothèques statiques dans le même docker.
Le programme est lié avec -static-libstdc++ -static-libgcc
Le programme est compilé en debug (incluant -g -ggdb)
La procédure de débug concrète:
- Entrer dans le docker
- Compiler le soft sur le pc cible, dans un dossier vide, (Normalement il est sans dépendance).
- copier aussi /usr/share/win32/gdbserver.exe, ainsi que ses dépendances, /usr/lib/gcc/i686-w64-mingw32/*-win32/lib{stdc++*.dll,gcc_s*.dll}
- sur le pc cible ouvrir une console avec droit d'admin et cd dans le dit dossier
- gdbserver.exe <une ip>:3636 Programme.exe
- gdbserver se lance, affiche qu'il attends une connexion.
- Sur le pc de build, toujours dans le docker, lancer i686-w64-mingw32-gdb Programme.exe
- quand le binaire est chargé (pour les symboles de débug), target remote <ip du pc window>:3636
- gdb charge les dlls windows.
- continue
- la segfault se produit systématiquement.
Si en 5) je fais juste Programme.exe tout se passe bien.
gdb affiche
$ i686-w64-mingw32-gdb Programme.exe
Reading symbols from Programme.exe...
(gdb) target remote <ip windows>:3636
Remote debugging using <ip windows>:3636
Reading C:/WINDOWS/SYSTEM32/ntdll.dll from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
Reading C:/WINDOWS/System32/kernel32.dll from remote target...
Reading C:/WINDOWS/System32/KernelBase.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/apphelp.dll from remote target...
Reading C:/WINDOWS/System32/advapi32.dll from remote target...
Reading C:/WINDOWS/System32/msvcrt.dll from remote target...
Reading C:/WINDOWS/System32/sechost.dll from remote target...
Reading C:/WINDOWS/System32/rpcrt4.dll from remote target...
Reading C:/WINDOWS/System32/sspicli.dll from remote target...
Reading C:/WINDOWS/System32/cryptbase.dll from remote target...
Reading C:/WINDOWS/System32/bcryptprimitives.dll from remote target...
Reading C:/WINDOWS/System32/gdi32.dll from remote target...
Reading C:/WINDOWS/System32/win32u.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/FWPUCLNT.DLL from remote target...
Reading C:/WINDOWS/SYSTEM32/dsound.dll from remote target...
Reading C:/WINDOWS/System32/gdi32full.dll from remote target...
Reading C:/WINDOWS/System32/bcrypt.dll from remote target...
Reading C:/WINDOWS/System32/msvcp_win.dll from remote target...
Reading C:/WINDOWS/System32/powrprof.dll from remote target...
Reading C:/WINDOWS/System32/ucrtbase.dll from remote target...
Reading C:/WINDOWS/System32/umpdc.dll from remote target...
Reading C:/WINDOWS/System32/user32.dll from remote target...
Reading C:/WINDOWS/System32/combase.dll from remote target...
Reading C:/WINDOWS/System32/imm32.dll from remote target...
Reading C:/WINDOWS/System32/ole32.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/winmm.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/IPHLPAPI.DLL from remote target...
Reading C:/WINDOWS/System32/oleaut32.dll from remote target...
Reading C:/WINDOWS/System32/shell32.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/winmmbase.dll from remote target...
Reading C:/WINDOWS/System32/cfgmgr32.dll from remote target...
Reading C:/WINDOWS/System32/SHCore.dll from remote target...
Reading C:/WINDOWS/System32/windows.storage.dll from remote target...
Reading C:/WINDOWS/System32/profapi.dll from remote target...
Reading C:/WINDOWS/System32/shlwapi.dll from remote target...
Reading C:/WINDOWS/System32/kernel.appcore.dll from remote target...
Reading C:/WINDOWS/System32/cryptsp.dll from remote target...
Reading C:/WINDOWS/System32/ws2_32.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/WinSCard.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/wininet.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/wsock32.dll from remote target...
Reading C:/WINDOWS/SYSTEM32/devobj.dll from remote target...
0x7778eaa3 in ntdll!LdrInitShimEngineDynamic () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
(gdb) continue
Continuing.
Thread 1 received signal SIGSEGV, Segmentation fault.
0x6d157d0b in WinSCard!SCardCancel () from target:C:/WINDOWS/SYSTEM32/WinSCard.dll
(gdb) bt
#0 0x6d157d0b in WinSCard!SCardCancel () from target:C:/WINDOWS/SYSTEM32/WinSCard.dll
#1 0x6d15bf2a in WinSCard!ClassInstall32 () from target:C:/WINDOWS/SYSTEM32/WinSCard.dll
#2 0x6d153758 in ?? () from target:C:/WINDOWS/SYSTEM32/WinSCard.dll
#3 0x6d1578ea in WinSCard!SCardCancel () from target:C:/WINDOWS/SYSTEM32/WinSCard.dll
#4 0x6d15712d in WinSCard!SCardCancel () from target:C:/WINDOWS/SYSTEM32/WinSCard.dll
#5 0x77751de6 in ntdll!RtlFreeUserStack () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#6 0x77715608 in ntdll!RtlGetNtSystemRoot () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#7 0x6d156ff0 in WinSCard!SCardCancel () from target:C:/WINDOWS/SYSTEM32/WinSCard.dll
#8 0x77723f8f in ntdll!RtlCompareUnicodeStrings () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#9 0x77724836 in ntdll!RtlMultiByteToUnicodeSize () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#10 0x7772484d in ntdll!RtlMultiByteToUnicodeSize () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#11 0x77789542 in ntdll!RtlCaptureStackContext () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#12 0x77789382 in ntdll!RtlCaptureStackContext () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#13 0x77731dd1 in ntdll!LdrInitializeThunk () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#14 0x77731cc1 in ntdll!LdrInitializeThunk () from target:C:/WINDOWS/SYSTEM32/ntdll.dll
#15 0x00000000 in ?? ()
(gdb)
WinSCard est un module du runtime de windows, qui permet d'accéder aux "smart cards", qui est mon matériel essentiel (une sorte de carte à puce)
Fait amusant, je peux faire un continue, et le main commence alors, la vérification des arguments de ligne de commande est faite, puis j'aurai une boucle infinie qui se crée, vers la création de l'IHM.
Autres informations possiblement pertinente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $ i686-w64-mingw32-gdb -v
GNU gdb (GDB) 9.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ i686-w64-mingw32-gcc -v
Using built-in specs.
COLLECT_GCC=i686-w64-mingw32-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-w64-mingw32/9.3-win32/lto-wrapper
Target: i686-w64-mingw32
Configured with: ../../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/include' --mandir='/usr/share/man' --infodir='/usr/share/info' --sysconfdir=/etc --localstatedir=/var --disable-silent-rules --libdir='/usr/lib/x86_64-linux-gnu' --libexecdir='/usr/lib/x86_64-linux-gnu' --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --enable-shared --enable-static --disable-multilib --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-libstdcxx-time=yes --with-tune=generic --with-headers=/usr/i686-w64-mingw32/include --enable-version-specific-runtime-libs --enable-fully-dynamic-string --enable-libgomp --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-lto --enable-threads=win32 --program-suffix=-win32 --program-prefix=i686-w64-mingw32- --target=i686-w64-mingw32 --with-as=/usr/bin/i686-w64-mingw32-as --with-ld=/usr/bin/i686-w64-mingw32-ld --enable-libatomic --enable-libstdcxx-filesystem-ts=yes --enable-dependency-tracking
Thread model: win32
gcc version 9.3-win32 20200320 (GCC) |
CMake utilise les flags de compilation suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.16
# compile CXX with /usr/lib/ccache/i686-w64-mingw32-g++
# compile RC with i686-w64-mingw32-windres
CXX_FLAGS = -g -ggdb -Wall -Wextra -Wctor-dtor-privacy -Woverloaded-virtual -Wold-style-cast -Wformat -Wformat-security -Werror=format-security -Wuninitialized -Winit-self -Wpointer-arith -fno-stack-protector -DDEBUG -D__STDC_FORMAT_MACROS -std=c++11
CXX_DEFINES = -DNOMINMAX -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_STATICPLUGIN -DQT_WIDGETS_LIB -DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0601
CXX_INCLUDES = @CMakeFiles/Programme.dir/includes_CXX.rsp
RC_FLAGS = -DDEBUG -D__STDC_FORMAT_MACROS
RC_DEFINES = -DCRYPTOSMART_TYPES_TEST_SUPPORT -DNOMINMAX -DNO_DRIVERLESS -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_STATICPLUGIN -DQT_WIDGETS_LIB -DSDK_TEST_SUPPORT -DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0601
RC_INCLUDES = -I~/Programe/build_windows_debug -I~/Programe -I~/Programe/build_windows_debug/Programme_autogen/include -I~/Programe/include -I~/Programe/include/Widgets -I~/artifacts/sdk-client/windows/debug/include -I~/artifacts/External/windows/debug/include/mbedtls-2.16 -I/opt/qt-win32-release-static/include -I/opt/qt-win32-release-static/include/QtWidgets -I/opt/qt-win32-release-static/include/QtGui -I/opt/qt-win32-release-static/include/QtCore -I/opt/qt-win32-release-static/./mkspecs/win32-g++ -I/opt/qt-win32-release-static/include/QtNetwork |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #CMakeFiles/Programme.dir/includes_CXX.rsp
-I~/Programme/build_windows_debug
-I~/Programme
-I~/Programme/build_windows_debug/Programme_autogen/include
-I~/Programme/include
-I~/Programme/include/Widgets
-isystem ~/artifacts/sdk-client/windows/debug/include
-isystem ~/artifacts/External/windows/debug/include/mbedtls-2.16
-isystem /opt/qt-win32-release-static/include
-isystem /opt/qt-win32-release-static/include/QtWidgets
-isystem /opt/qt-win32-release-static/include/QtGui
-isystem /opt/qt-win32-release-static/include/QtCore
-isystem /opt/qt-win32-release-static/./mkspecs/win32-g++
-isystem /opt/qt-win32-release-static/include/QtNetwork |
L'édition de lien:
/usr/lib/ccache/i686-w64-mingw32-g++ -g -ggdb -static -mwindows -Wl,--whole-archive CMakeFiles/Programme.dir/objects.a -Wl,--no-whole-archive -o Programme.exe -Wl,--out-implib,libProgramme.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/Programme.dir/linklibs.rsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #linklibs.rsp
/opt/qt-win32-release-static/plugins/bearer/libqgenericbearer.a
/opt/qt-win32-release-static/plugins/bearer/libqnativewifibearer.a
/opt/qt-win32-release-static/plugins/platforms/libqwindows.a
/opt/qt-win32-release-static/lib/libQt5Widgets.a
/opt/qt-win32-release-static/lib/libQt5Network.a
/opt/qt-win32-release-static/lib/libQt5Gui.a
/opt/qt-win32-release-static/lib/libQt5Core.a
/opt/qt-win32-release-static/lib/libqtpcre.a
/opt/qt-win32-release-static/lib/libqtpng.a
/opt/qt-win32-release-static/lib/libqtharfbuzzng.a
/opt/qt-win32-release-static/lib/libQt5PlatformSupport.a
-limm32
-lopengl32
-liphlpapi
-lws2_32
-lrpcrt4
-lfwpuclnt
~/artifacts/sdk-client/windows/debug/lib/libSDK.a
~/artifacts/External/windows/debug/lib/libspeex.a
~/artifacts/External/windows/debug/lib/libpcre.a
~/artifacts/External/windows/debug/lib/libminizip.a
~/artifacts/External/windows/debug/lib/libzlib.a
-lwsock32
-lws2_32
-lwininet
-lwinmm
-ldsound
-lwinscard
-lksuser
-lwbemuuid
~/artifacts/External/windows/debug/lib/libsqlite.a
~/artifacts/External/windows/debug/lib/libmbedtls.a
-static-libgcc
-static-libstdc++
-static-libgcc
-static-libstdc++
/opt/qt-win32-release-static/lib/libqtmain.a
-lws2_32
-lrpcrt4
-lfwpuclnt
-lkernel32
-luser32
-lgdi32
-lwinspool
-lshell32
-lole32
-loleaut32
-luuid
-lcomdlg32
-ladvapi32 |
Partager