Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Segmentation fault dans le runtime lors de l'appel à une fonction exportée

2 réponses
Avatar
Bastien Durel
Bonjour,

J'ai un probl=E8me lors de l'appel =E0 une fonction export=E9e d'une dll
que j'ai =E9crite moi-m=EAme.
Je compile le programme comme la dll avec gcc/g++, et utilise la
biblioth=E8que ICU pour g=E9rer les diff=E9rents encodings. Lorsque je
fais un b=EAte appel =E0 l'une des fonctions export=E9es, une erreur de
segmentation est lev=E9e, et gdb ne peut pas remonter dans la pile.

g++ -g3 -DDEBUG -Wall -DUSE_ICU -I../icuapi/include/unicode
-I../icuapi/include -c _main.cpp -o _main.o
g++ -o test.exe -licuuc -L../icuapi/lib _main.o

gdb ./test.exe
GNU gdb 5.2.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and
you are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i686-pc-mingw32"...
(gdb) r
Starting program: ./test.exe

Breakpoint 1, test() () at _main.cpp:38
38 std::string lMyDll;
(gdb) next
39 std::cout << "Enter file to load: ";
(gdb)
40 std::cin >> lMyDll;
(gdb)
42 HMODULE lDll=3DLoadLibrary(lMyDll.c_str());
(gdb)
46 assert(lDll);
(gdb)
52 GETPROC lProcGet=3D(GETPROC)GetProcAddress(lDll,
"getParser");
(gdb)
68 const wchar_t * lFile=3DL"test.csv";
(gdb)
70 TDataUserParser* lParser=3DlProcGet(lFile, NULL);
(gdb) print lProcGet
$1 =3D 0xe212d0
(gdb) step
Program received signal SIGSEGV, Segmentation fault.
0x77c17fd4 in _libmsvcrt_a_iname ()
(gdb) where
#0 0x77c17fd4 in _libmsvcrt_a_iname ()
(gdb) Cannot access memory at address 0x1087a170

J'ai googlis=E9 sans r=E9sultat (=E0 part des r=E9f=E9rences ind=E9finies en
pagaille) sur cette fonction ...
Pouvez-vous me dire ce que ce programme va faire dans cette fonction,
alors que je lui demandais gentiment de sauter dans ma dll ? Et ce
qu'il y fait pour provoquer cette erreur ?

Merci,

--=20
Bastien Durel.

2 réponses

Avatar
Vincent Burel
"Bastien Durel" wrote in message
news:
Bonjour,

J'ai un problème lors de l'appel à une fonction exportée d'une dll


que j'ai écrite moi-même.
Je compile le programme comme la dll avec gcc/g++, et utilise la
bibliothèque ICU pour gérer les différents encodings. Lorsque je
fais un bête appel à l'une des fonctions exportées, une erreur de
segmentation est levée, et gdb ne peut pas remonter dans la pile.



ca sent une incompatibilité au niveau du protocole d'appel... par exemple
votre fonction est appelé en __cdecl mais déclarée __stdcall ou
inversement... Bref, vérifiez que vos fonction exportées aient le même
protocole d'appel que ce qu'utilise l'appelant...

VB
Avatar
Bastien Durel
Vincent Burel a écrit :
"Bastien Durel" wrote in message
news:
Bonjour,

J'ai un problème lors de l'appel à une fonction exportée d'une dll
que j'ai écrite moi-même.
Je compile le programme comme la dll avec gcc/g++, et utilise la
bibliothèque ICU pour gérer les différents encodings. Lorsque je
fais un bête appel à l'une des fonctions exportées, une erreur de
segmentation est levée, et gdb ne peut pas remonter dans la pile.



ca sent une incompatibilité au niveau du protocole d'appel... par exemple
votre fonction est appelé en __cdecl mais déclarée __stdcall ou
inversement... Bref, vérifiez que vos fonction exportées aient le même
protocole d'appel que ce qu'utilise l'appelant...



Bonjour,

Merci de votre réponse. Ce n'était pas du à cela, mais à un un appel
incorrect à wcslen(). Quand à savoir pourquoi gdb me parlait de
_libmsvcrt_a_iname ... c'est une autre histoire. Sans parler du fait
qu'il ait lamentablement échoué à suivre le call.

Bonne journée.