Segmentation fault dans le runtime lors de l'appel à une fonction exportée
2 réponses
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.
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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"Bastien Durel" <bastien@geekwu.org> wrote in message
news:1154019935.353843.10840@h48g2000cwc.googlegroups.com...
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...
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
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.
Vincent Burel a écrit :
"Bastien Durel" <bastien@geekwu.org> wrote in message
news:1154019935.353843.10840@h48g2000cwc.googlegroups.com...
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.
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.