Discussion:
Runtime Error 204
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
McP
2007-09-27 13:50:08 UTC
Permalink
Moja aplikacja jak do tej pory działała prawidłowo na wszystkich komputerach. Do
dziś. Znajomy postawił sobie świeżutki XP Pro z wszystkimi łatkami. Poinstalował
wszystkie potrzebne mu aplikacje a potem przyszła kolej na uruchomienie mojej. I
tu niespodzianka: Runtime Error 204. Co może być przyczyną tego zachowania?
Aplikacja pisana w D7. W zasadzie to jest jeden exe i dwa dll. Komunikacja z dll
za pomocą FastShareMem. Próbowałem wyciąć tego menedżera i robić wszystko
wewnątrz exe ale efekt ten sam. Zamiast Error 204 tym razem dostaję informację o
błędzie, który mogę wysłać do MS. Nie mam żadnej wiedzy na temat debugowania
takich zachowań. Przyglądnąłem się zrzutowi z Dr Watsona i nawet nie wiem jak to
czytać. Może ktoś mi wskaże gdzie jest problem i jak go rozwiązać? Poniżej
załączam raport z Watsona



Wystąpił wyjątek aplikacji:
Apl: C:\Documents and Settings\JP\Pulpit\Nowy folder\ISYDYW1a.exe (pid=2956)
Kiedy: 2007-09-27 @ 15:33:53.937
Numer wyjątku: c0000005 (naruszenie praw dostępu)

*----> Informacje o systemie <----*
Nazwa komputera: JP-KOMP
Nazwa użytkownika: JP
Identyfikator sesji terminala: 0
Liczba procesorów: 1
Typ procesora: x86 Family 15 Model 2 Stepping 9
Wersja systemu Windows: 5.1
Bieżąca kompilacja: 2600
Dodatek Service Pack: 2.
Bieżący typ: Uniprocessor Free
Zarejestrowana organizacja:
Zarejestrowany właściciel: J.P.

*----> Lista zadań <----*
0 System Process
4 System
468 smss.exe
644 csrss.exe
668 winlogon.exe
720 services.exe
732 lsass.exe
876 svchost.exe
936 svchost.exe
976 svchost.exe
1040 svchost.exe
1124 svchost.exe
1232 aswUpdSv.exe
1284 ashServ.exe
1460 spoolsv.exe
1508 SCardSvr.exe
1584 CeEPwrSvc.exe
204 alg.exe
1012 Explorer.EXE
1996 Apoint.exe
2024 CePMTray.exe
2456 wscntfy.exe
2908 LaunchPad.exe
2956 ISYDYW1a.exe
2920 drwtsn32.exe

*----> Lista modułów <----*
(0000000000400000 - 0000000000a86000: C:\Documents and Settings\JP\Pulpit\Nowy
folder\ISYDYW1a.exe
(000000005c8f0000 - 000000005c911000: C:\WINDOWS\system32\GLU32.dll
(000000005d520000 - 000000005d5ba000: C:\WINDOWS\system32\comctl32.dll
(000000005f190000 - 000000005f25c000: C:\WINDOWS\system32\OpenGL32.dll
(0000000071ac0000 - 0000000071ad2000: C:\WINDOWS\system32\mpr.dll
(0000000072f90000 - 0000000072fb6000: C:\WINDOWS\system32\winspool.drv
(00000000736f0000 - 0000000073739000: C:\WINDOWS\system32\DDRAW.dll
(0000000073b50000 - 0000000073b56000: C:\WINDOWS\system32\DCIMAN32.dll
(0000000076380000 - 00000000763c9000: C:\WINDOWS\system32\comdlg32.dll
(0000000076820000 - 0000000076853000:
C:\WINDOWS\System32\spool\DRIVERS\W32X86\3\UNIDRVUI.DLL
(0000000076b20000 - 0000000076b4e000: C:\WINDOWS\system32\winmm.dll
(0000000077110000 - 000000007719b000: C:\WINDOWS\system32\oleaut32.dll
(00000000773c0000 - 00000000774c3000:
C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
(00000000774d0000 - 000000007760d000: C:\WINDOWS\system32\ole32.dll
(0000000077b30000 - 0000000077b52000: C:\WINDOWS\system32\Apphelp.dll
(0000000077bf0000 - 0000000077bf8000: C:\WINDOWS\system32\version.dll
(0000000077c00000 - 0000000077c58000: C:\WINDOWS\system32\msvcrt.dll
(0000000077dc0000 - 0000000077e6c000: C:\WINDOWS\system32\advapi32.dll
(0000000077e70000 - 0000000077f01000: C:\WINDOWS\system32\RPCRT4.dll
(0000000077f10000 - 0000000077f57000: C:\WINDOWS\system32\GDI32.dll
(0000000077f60000 - 0000000077fd6000: C:\WINDOWS\system32\SHLWAPI.dll
(000000007c800000 - 000000007c8fc000: C:\WINDOWS\system32\kernel32.dll
(000000007c900000 - 000000007c9b2000: C:\WINDOWS\system32\ntdll.dll
(000000007c9c0000 - 000000007d1dc000: C:\WINDOWS\system32\shell32.dll
(000000007e360000 - 000000007e3f0000: C:\WINDOWS\system32\user32.dll

*----> Zrzut stanu dla wątku o identyfikatorze 0xbbc <----*

eax=08ff5eac ebx=00405692 ecx=00000000 edx=0012fb01 esi=00000000 edi=0012ff78
eip=00404ba2 esp=0012fb10 ebp=0012ff98 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00210206

*** WARNING: Unable to verify checksum for C:\Documents and
Settings\JP\Pulpit\Nowy folder\ISYDYW1a.exe
*** ERROR: Module load completed but symbols could not be loaded for
C:\Documents and Settings\JP\Pulpit\Nowy folder\ISYDYW1a.exe
funkcja: ISYDYW1a
00404b8d eb03 jmp ISYDYW1a+0x4b92 (00404b92)
00404b8f 0000 add [eax],al
00404b91 84d2 test dl,dl
00404b93 7e05 jle ISYDYW1a+0x4b9a (00404b9a)
00404b95 e8ca030000 call ISYDYW1a+0x4f64 (00404f64)
00404b9a c3 ret
00404b9b 90 nop
00404b9c 85c0 test eax,eax
00404b9e 7407 jz ISYDYW1a+0x4ba7 (00404ba7)
00404ba0 b201 mov dl,0x1
BŁĄD ->00404ba2 8b08 mov ecx,[eax] ds:0023:08ff5eac=????????
00404ba4 ff51fc call dword ptr [ecx-0x4]
00404ba7 c3 ret
00404ba8 53 push ebx
00404ba9 56 push esi
00404baa 57 push edi
00404bab 89c3 mov ebx,eax
00404bad 89d7 mov edi,edx
00404baf ab stosd
00404bb0 8b4bd8 mov ecx,[ebx-0x28]
00404bb3 31c0 xor eax,eax

*----> Wsteczne śledzenie stosu <----*
WARNING: Stack unwind information not available. Following frames may be wrong.
*** ERROR: Symbol file could not be found. Defaulted to export symbols for
C:\WINDOWS\system32\kernel32.dll -
ChildEBP RetAddr Args to Child
0012ff98 004056e7 0040827b 7ffd7000 00816cad ISYDYW1a+0x4ba2
0012ffc0 7c816fd7 00370036 00350034 7ffd7000 ISYDYW1a+0x56e7
0012fff0 00000000 00816c9c 00000000 7c809a51 kernel32!RegisterWaitForInputIdle+0x49

*----> Zrzut stosu <----*
000000000012fb10 d9 53 40 00 9c 56 40 00 - 00 00 00 00 ce 61 54 00
***@..V@......aT.
000000000012fb20 ac 5e ff 08 24 fc 12 00 - 50 fb 12 00 5c fb 12 00
.^..$...P...\...
000000000012fb30 00 00 00 00 00 00 00 00 - 00 00 00 00 bf 37 90 7c
.............7.|
000000000012fb40 24 fc 12 00 78 ff 12 00 - 40 fc 12 00 f8 fb 12 00
$***@.......
000000000012fb50 0c ff 12 00 d8 37 90 7c - 78 ff 12 00 0c fc 12 00
.....7.|x.......
000000000012fb60 8b 37 90 7c 24 fc 12 00 - 78 ff 12 00 40 fc 12 00
.7.|$***@...
000000000012fb70 f8 fb 12 00 8d 56 40 00 - 01 00 00 00 24 fc 12 00
***@.....$...
000000000012fb80 78 ff 12 00 60 78 93 7c - 24 fc 12 00 78 ff 12 00
x...`x.|$...x...
000000000012fb90 40 fc 12 00 f8 fb 12 00 - 8d 56 40 00 d0 5c ff 08
@***@..\..
000000000012fba0 24 fc 12 00 d0 5c ff 08 - 06 00 00 00 a8 07 15 00
$....\..........
000000000012fbb0 00 00 15 00 00 00 00 00 - a8 fb 12 00 00 00 00 00
................
000000000012fbc0 ec fd 12 00 18 ee 90 7c - 9a 00 00 00 fc fd 12 00
.......|........
000000000012fbd0 38 15 91 7c 96 15 91 7c - eb 06 91 7c 00 00 00 00
8..|...|...|....
000000000012fbe0 46 5d ff 08 11 00 00 00 - 70 00 00 00 ec fb 12 00
F]......p.......
000000000012fbf0 ec fb 12 00 17 00 00 00 - 01 00 00 00 24 fe 12 00
............$...
000000000012fc00 00 00 13 00 00 c0 12 00 - 00 00 00 00 44 ff 12 00
............D...
000000000012fc10 fa ea 90 7c 00 00 00 00 - 40 fc 12 00 24 fc 12 00
...|***@...$...
000000000012fc20 40 fc 12 00 05 00 00 c0 - 00 00 00 00 00 00 00 00
@...............
000000000012fc30 ce 61 54 00 02 00 00 00 - 00 00 00 00 2e 00 00 00
.aT.............
000000000012fc40 3f 00 01 00 00 00 00 00 - 00 00 00 00 00 00 00 00
?...............
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
fijak
2007-09-27 15:27:47 UTC
Permalink
Post by McP
Moja aplikacja jak do tej pory działała prawidłowo na wszystkich komputerach. Do
dziś. Znajomy postawił sobie świeżutki XP Pro z wszystkimi łatkami. Poinstalował
wszystkie potrzebne mu aplikacje a potem przyszła kolej na uruchomienie mojej. I
tu niespodzianka: Runtime Error 204.
Inavlid pointer operation
Czyli odowujesz sie do wskaznika ktory nie jest prawidlowy,
najprawdopodobniej null.
Jesli nei mozesz postawic tam kompilatora i normalnie debuggowac, to
sprobuj zrobic logowanie operacji ktore wykonujesz, np do pliku tekstowego.
Zaraz po uruchomieniu dopisz do pliku np "Uruchomiono" po wykonaiu jakis
operacji inicjaliacyjnych dopisz scos innego.
Wtedy moze dojdziesz do momentu ktory powoduje blad.
Post by McP
Apl: C:\Documents and Settings\JP\Pulpit\Nowy folder\ISYDYW1a.exe (pid=2956)
Numer wyjątku: c0000005 (naruszenie praw dostępu)
to jest to samo po prostu odwolujesz sie do pamieci (adresu pamieci)
ktora jest nieprawidlowa
McP
2007-09-27 19:02:29 UTC
Permalink
Post by fijak
Jesli nei mozesz postawic tam kompilatora i normalnie debuggowac, to
sprobuj zrobic logowanie operacji ktore wykonujesz, np do pliku tekstowego.
Zaraz po uruchomieniu dopisz do pliku np "Uruchomiono" po wykonaiu jakis
operacji inicjaliacyjnych dopisz scos innego.
Wtedy moze dojdziesz do momentu ktory powoduje blad.
Dzięki za wskazówkę choć bardzo kłopotliwa będzie jej realizacja. Klient jest
teraz na odległość.
Zastanawia mnie co jest przyczyną takiego zachowania. Na wszystkich komputerach
ta sama wersja softu działa a na jednym nie. Domyślam się, że może to być
spowodowane przez jakąś (starszą?) bibliotekę. Czy na podstawie tego logu z
DrWatsona można dojść do tego, która biblioteka robi problemy?
W rozpaczy próbowałem na siłę podmienić którąś z dll wskazanych jako właśnie
załadowane ale wszystkie są chronione i nic z tego nie wyszło.
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
J-23
2007-09-27 20:39:35 UTC
Permalink
Post by McP
Post by fijak
Jesli nei mozesz postawic tam kompilatora i normalnie debuggowac, to
sprobuj zrobic logowanie operacji ktore wykonujesz, np do pliku tekstowego.
Zaraz po uruchomieniu dopisz do pliku np "Uruchomiono" po wykonaiu jakis
operacji inicjaliacyjnych dopisz scos innego.
Wtedy moze dojdziesz do momentu ktory powoduje blad.
Dzięki za wskazówkę choć bardzo kłopotliwa będzie jej realizacja. Klient jest
teraz na odległość.
Zastanawia mnie co jest przyczyną takiego zachowania. Na wszystkich komputerach
ta sama wersja softu działa a na jednym nie. Domyślam się, że może to być
spowodowane przez jakąś (starszą?) bibliotekę. Czy na podstawie tego logu z
DrWatsona można dojść do tego, która biblioteka robi problemy?
W rozpaczy próbowałem na siłę podmienić którąś z dll wskazanych jako właśnie
załadowane ale wszystkie są chronione i nic z tego nie wyszło.
Może to nic nie da ale sprobuj np. jakim programem (chyba Memprof to
umożliwia) zobaczyć których bibliotek używa potem bez ich podmiany
sprawdzić wersje i bedziesz mial jasny obraz

Pozdrawiam
J-23
TButton
2007-09-27 20:52:27 UTC
Permalink
Post by J-23
Może to nic nie da ale sprobuj np. jakim programem (chyba Memprof to
umożliwia) zobaczyć których bibliotek używa potem bez ich podmiany
sprawdzić wersje i bedziesz mial jasny obraz
Pozdrawiam
J-23
Kiedyś używałem MemProof , ktoś wie gdzie to można znaleźć ?
Bo na stronie autora już nie widzę, tylko komercyjne produkty
McP
2007-09-27 22:39:27 UTC
Permalink
Post by TButton
Kiedyś używałem MemProof , ktoś wie gdzie to można znaleźć ?
Bo na stronie autora już nie widzę, tylko komercyjne produkty
Google rulez :>
http://www.onlythebestfreeware.com/program.asp?program_id=138

zaraz łapię się za pacyfikację problemu
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
jan
2007-09-28 05:55:28 UTC
Permalink
Post by McP
Może ktoś mi wskaże gdzie jest problem i jak go rozwiązać?
Uzyj Eurekalog
http://www.eurekalog.com/

jjb
Magda S
2007-10-08 22:13:24 UTC
Permalink
Post by McP
funkcja: ISYDYW1a
00404b8d eb03 jmp ISYDYW1a+0x4b92 (00404b92)
00404b8f 0000 add [eax],al
00404b91 84d2 test dl,dl
00404b93 7e05 jle ISYDYW1a+0x4b9a (00404b9a)
Nie budzi to Twoich podejrzeń? Popatrz, w które miejsce wykonuje się skok.
Post by McP
00404b95 e8ca030000 call ISYDYW1a+0x4f64 (00404f64)
00404b9a c3 ret
00404b9b 90 nop
A jakim cudem tutaj dociera?
00404b9c 85c0 test eax,eax
Post by McP
00404b9e 7407 jz ISYDYW1a+0x4ba7 (00404ba7)
00404ba0 b201 mov dl,0x1
BŁĄD ->00404ba2 8b08 mov ecx,[eax] ds:0023:08ff5eac=????????
Paweł Seledec
2007-10-09 06:27:47 UTC
Permalink
Post by Magda S
Post by McP
funkcja: ISYDYW1a
00404b8d eb03 jmp ISYDYW1a+0x4b92 (00404b92)
00404b8f 0000 add [eax],al
00404b91 84d2 test dl,dl
00404b93 7e05 jle ISYDYW1a+0x4b9a (00404b9a)
Nie budzi to Twoich podejrzeń? Popatrz, w które miejsce wykonuje się skok.
Post by McP
00404b95 e8ca030000 call ISYDYW1a+0x4f64 (00404f64)
00404b9a c3 ret
00404b9b 90 nop
A jakim cudem tutaj dociera?
00404b9c 85c0 test eax,eax
Post by McP
00404b9e 7407 jz ISYDYW1a+0x4ba7 (00404ba7)
00404ba0 b201 mov dl,0x1
BŁĄD ->00404ba2 8b08 mov ecx,[eax]
ds:0023:08ff5eac=????????
Magda, czepiasz się.
To kod wygenerowany przez Delphi i wyłapany przez DrWatsona.
Nawet deasemblerem nie uzyskasz kodu w 100% zgodnego ze
źródłem, bo wszystko zależy od punktu widzenia (startu)
deasemblacji. Nie możesz więc na podstawie tego wyciągać
wniosków o błędzie w kodzie. To jest jedynie
wskazówka. A program może w to miejsce
wchodzić z zupełnie innego adresu niż
widzisz w tym wycinku kodu.
--
Paweł Seledec
Magda S
2007-10-09 18:44:58 UTC
Permalink
Post by Paweł Seledec
Magda, czepiasz się.
Nie zwykłam używać brzydkich słów, więc nie skomentuję tego.
Post by Paweł Seledec
To kod wygenerowany przez Delphi i wyłapany przez DrWatsona.
Nawet deasemblerem nie uzyskasz kodu w 100% zgodnego ze
źródłem, bo wszystko zależy od punktu widzenia (startu)
deasemblacji. Nie możesz więc na podstawie tego wyciągać
wniosków o błędzie w kodzie. To jest jedynie
wskazówka. A program może w to miejsce
wchodzić z zupełnie innego adresu niż
widzisz w tym wycinku kodu.
Powiedział co wiedział.

Wychodzi na to, że top-autor wątku niepotrzebnie się wysilał, bo na
podstawie zamieszczonego kodu "nie można wyciągać wniosków".

Wracając do tematu. Watson rozpoznał początek funkcji i punkt wejścia.
Ten punkt wejścia wygląda na typową zmyłę dla deasemblerów i ważne
pytanie, czy ten kod został wygenerowany przez kompilator Delphi
(kompilatory raczej takich chwytów nie stosują). Czy ten kod NA PEWNO
działał w 100% bezbłędnie we wczesniejszych Windows? Czy nie zdarzały
się sporadyczne wyloty o podobnym charakterze?
GrzesiekN
2007-10-09 20:29:56 UTC
Permalink
Mnemonik EB -> JMP rel8

EB 03 => EIP + 3

program skacze do 00404b91 wszystko pasi.

A Ciebie Magdo S, o ile jesteś kobietą, za tekst
Post by Magda S
Ten punkt wejścia wygląda na typową zmyłę dla deasemblerów i ważne
pytanie, czy ten kod został wygenerowany przez kompilator Delphi
(kompilatory raczej takich chwytów nie stosują).
już lubię

Pozdrawiam. GrzesiekN
Paweł Seledec
2007-10-10 09:01:09 UTC
Permalink
Post by GrzesiekN
Mnemonik EB -> JMP rel8
EB 03 => EIP + 3
program skacze do 00404b91 wszystko pasi.
Nic nie pasi. Wprowadzacie pytacza w błąd.
fijak dał mu wystarczające wskazówki do tego gdzie
szukać błędu (204 - Invalid Pointer Operation)

A ten wątek to już jest OT, ale dla wyjaśnienia
pokażę dlaczego nie można uznać tego fragmentu za
poprawnie zdeasemblowany kod programu.
Jest bardzo niewiele dekompilatorów i deasemblerów,
które w takiej sytuacji by sobie poradziły i
nie należy do nich DrWatson.
A DrWatson pokazuje dokładnie 10 zdeasemblowanych linii kodu
przed punktem wyłapania błędu i po nim, ot cała tajemnica.
I wcale nie pokazuje punktu wejścia do funkcji.
Post by GrzesiekN
00404b8d eb03 jmp ISYDYW1a+0x4b92 (00404b92)
Ten skok prowadzi do adresu 00404b92, jak napisano w nawiasie.
Post by GrzesiekN
00404b8f 0000 add [eax],al
Ale tu jest niespodzianka, bo deasembler tego już nie rozpoznał
i poleciał po instrukcjach, które zna i deasemblacja tego fragmentu
jest już wadliwa - nie ma instrukcji pod takim adresem!!!!
Post by GrzesiekN
00404b91 84d2 test dl,dl
00404b93 7e05 jle ISYDYW1a+0x4b9a (00404b9a)
00404b95 e8ca030000 call ISYDYW1a+0x4f64 (00404f64)
00404b9a c3 ret
00404b9b 90 nop
Gdybyście wykonywali ten kod i debugowali
instrukcja po instrukcji to zobaczylibyście np. coś takiego:

00404b92 d27e05 sar byte ptr [bp+05], cl
00404b95 e8ca030000 call ISYDYW1a+0x4f64 (00404f64)
00404b9a c3 ret
00404b9b 90 nop

A bajty 000084 to nic innego jak dane, które wykorzystuje inny fragment
tego programu. Bardzo możliwe, że cały ten fragment to stałe a nie kod.

Najfajniejsze z tego jest to, że cały ten fragment nas
kompletnie nie obchodzi, bo kończy się instrukcją ret i nie ma żadnego
powiązania z dalszą częścią kodu. Właściwy punkt wejścia jest pod
adresem 00404b9c i tylko ten fragment kodu należy rozpatrywać.
A tam widać, że w eax jest podany adres pamięci 08ff5eac i program
nie może z niego pobrać danych, bo najprawdopodobniej obiekt został
wcześniej zwolniony, a wskaźnik do niego nie został ustawiony na nil.
Post by GrzesiekN
Post by Magda S
Ten punkt wejścia wygląda na typową zmyłę dla deasemblerów i ważne
pytanie, czy ten kod został wygenerowany przez kompilator Delphi
(kompilatory raczej takich chwytów nie stosują).
Żadna zmyła. Może to być zarówno efekt optymalizacji (wyrównanie do
słowa a nie do bajtu, np. instrukcja nop) jak i po
prostu wkompilowanie stałych do kodu.
Post by GrzesiekN
Aplikacja pisana w D7. W zasadzie to jest jeden exe i dwa dll.
Komunikacja z dll
za pomocą FastShareMem.
Nie ma słowa o wstawkach asemblerowych. A wy mu mieszacie
niepotrzebnie w głowie i całkowicie nie na temat.
--
Paweł Seledec
Magda S
2007-10-10 10:32:48 UTC
Permalink
Post by Paweł Seledec
Post by GrzesiekN
Mnemonik EB -> JMP rel8
EB 03 => EIP + 3
program skacze do 00404b91 wszystko pasi.
Nic nie pasi. Wprowadzacie pytacza w błąd.
fijak dał mu wystarczające wskazówki do tego gdzie
szukać błędu (204 - Invalid Pointer Operation)
Ciekawe, jak z KODU błędu (204 = Invalid Pointer Operation) wynika,
GDZIE szukać jego przyczyny. Pomyśl człowieku, zanim znowu coś napiszesz.
Post by Paweł Seledec
A ten wątek to już jest OT, ale dla wyjaśnienia
pokażę dlaczego nie można uznać tego fragmentu za
poprawnie zdeasemblowany kod programu.
Jest bardzo niewiele dekompilatorów i deasemblerów,
które w takiej sytuacji by sobie poradziły i
nie należy do nich DrWatson.
A DrWatson pokazuje dokładnie 10 zdeasemblowanych linii kodu
przed punktem wyłapania błędu i po nim, ot cała tajemnica.
I wcale nie pokazuje punktu wejścia do funkcji.
Post by GrzesiekN
00404b8d eb03 jmp ISYDYW1a+0x4b92 (00404b92)
Ten skok prowadzi do adresu 00404b92, jak napisano w nawiasie.
Post by GrzesiekN
00404b8f 0000 add [eax],al
Ale tu jest niespodzianka, bo deasembler tego już nie rozpoznał
i poleciał po instrukcjach, które zna i deasemblacja tego fragmentu
jest już wadliwa - nie ma instrukcji pod takim adresem!!!!
Post by GrzesiekN
00404b91 84d2 test dl,dl
00404b93 7e05 jle ISYDYW1a+0x4b9a (00404b9a)
00404b95 e8ca030000 call ISYDYW1a+0x4f64 (00404f64)
00404b9a c3 ret
00404b9b 90 nop
Gdybyście wykonywali ten kod i debugowali
00404b92 d27e05 sar byte ptr [bp+05], cl
00404b95 e8ca030000 call ISYDYW1a+0x4f64 (00404f64)
00404b9a c3 ret
00404b9b 90 nop
A bajty 000084 to nic innego jak dane, które wykorzystuje inny fragment
tego programu. Bardzo możliwe, że cały ten fragment to stałe a nie kod.
To dlaczego wykonywany jest skok do tego fragmentu?
Post by Paweł Seledec
Najfajniejsze z tego jest to, że cały ten fragment nas
kompletnie nie obchodzi, bo kończy się instrukcją ret i nie ma żadnego
powiązania z dalszą częścią kodu. Właściwy punkt wejścia jest pod
adresem 00404b9c i tylko ten fragment kodu należy rozpatrywać.
A tam widać, że w eax jest podany adres pamięci 08ff5eac i program
nie może z niego pobrać danych, bo najprawdopodobniej obiekt został
wcześniej zwolniony, a wskaźnik do niego nie został ustawiony na nil.
To dlaczego we wczesniejszych Windows KONSEKWENTNIE chodziło, a w XP
KONSEKWENTNIE się wali?
Post by Paweł Seledec
Post by GrzesiekN
Post by Magda S
Ten punkt wejścia wygląda na typową zmyłę dla deasemblerów i ważne
pytanie, czy ten kod został wygenerowany przez kompilator Delphi
(kompilatory raczej takich chwytów nie stosują).
Żadna zmyła. Może to być zarówno efekt optymalizacji (wyrównanie do
słowa a nie do bajtu, np. instrukcja nop) jak i po
prostu wkompilowanie stałych do kodu.
Taki wniosek nasuwa się po przeczytanie powyższego:

Sterowanie tak sobie po prostu przechodzi przez te wkompilowane dane.
Oczywiście rozpoznaje, że to są dane a nie kod i ignoruje je aż do
napotkania kodu. I dlatego kompilatory mogą sobie bezkarnie pozwolić na
wplatanie w kod fragmentów danych bez przeskakiwania tych fragmentów.
Post by Paweł Seledec
Nie ma słowa o wstawkach asemblerowych. A wy mu mieszacie
niepotrzebnie w głowie i całkowicie nie na temat.
A tu się znalazł jeden oświecony, który wszystko wie i oczywiście
ostatecznie wyjaśnił, gdzie leży przyczyna błędu i co należy zrobić,
żeby ten błąd usunąć.


A do top-autora:

Gdybyś pokazał fragment źródeł... I konkretna wskazówka (o ile masz
źródła): spróbuj tak przekształcić kod (o ile się da), żeby FastShareMem
nie było potrzebne. Na przykład wszystkie stringi będące parametrami i
wynikami eksportowanych funkcji pozamieniaj na ShortStringi (oczywiście
o ile to możliwe). Może nie docelowo, ale doraźnie, dla eksperymentu.
Paweł Seledec
2007-10-10 12:00:03 UTC
Permalink
Post by Magda S
Ciekawe, jak z KODU błędu (204 = Invalid Pointer Operation) wynika,
GDZIE szukać jego przyczyny. Pomyśl człowieku, zanim znowu coś napiszesz.
Czepiasz się słówek, jesteś TROLLEM?
Post by Magda S
To dlaczego wykonywany jest skok do tego fragmentu?
A po co ci to do szczęścia potrzebne? Czytaj ze zrozumieniem w dalszej
części postu.
Post by Magda S
To dlaczego we wczesniejszych Windows KONSEKWENTNIE chodziło, a w XP
KONSEKWENTNIE się wali?
Np. dlatego, że XP bardziej restrykcyjnie podchodzi do zwalniania
pamięci po obiektach. W niższych wersjach można się było dostać
do pamięci po zwolnionym obiekcie i nic się specjalnego nie działo
aż do momentu wykorzystania tego obszaru przez nowy obiekt.
Post by Magda S
Sterowanie tak sobie po prostu przechodzi przez te wkompilowane dane.
Oczywiście rozpoznaje, że to są dane a nie kod i ignoruje je aż do
napotkania kodu. I dlatego kompilatory mogą sobie bezkarnie pozwolić na
wplatanie w kod fragmentów danych bez przeskakiwania tych fragmentów.
Przecież tam jest skok! Coś chyba nie miałaś większego doświadczenia
z assemblerem i debugowaniem na poziomie kodu maszynowego.
Post by Magda S
A tu się znalazł jeden oświecony, który wszystko wie i oczywiście
ostatecznie wyjaśnił, gdzie leży przyczyna błędu i co należy zrobić,
żeby ten błąd usunąć.
Nie wyjaśniłem, bo przyczyn może być wiele, a bez kodu nie ma
najmniejszych szans wskazać palcem o co konkretnie chodzi.

Dla mnie to koniec tej dyskusji.
--
Paweł Seledec
Magda S
2007-10-10 12:07:26 UTC
Permalink
Post by Paweł Seledec
Np. dlatego, że XP bardziej restrykcyjnie podchodzi do zwalniania
pamięci po obiektach. W niższych wersjach można się było dostać
do pamięci po zwolnionym obiekcie i nic się specjalnego nie działo
aż do momentu wykorzystania tego obszaru przez nowy obiekt.
Nie ośmieszaj się.
Post by Paweł Seledec
Przecież tam jest skok! Coś chyba nie miałaś większego doświadczenia
z assemblerem i debugowaniem na poziomie kodu maszynowego.
Zapraszam na lekcje, bezczelny dyletancie.

Poza tym nie komentowałam konkretnego kodu, tylko bzdury, które
bezmyślnie wypisywałeś.
Post by Paweł Seledec
Nie wyjaśniłem, bo przyczyn może być wiele, a bez kodu nie ma
najmniejszych szans wskazać palcem o co konkretnie chodzi.
To po co się w ogóle odzywasz, skoro nic konkretnego nie masz do
powiedzenia?
yankee
2007-10-10 12:34:03 UTC
Permalink
Post by Magda S
Post by Paweł Seledec
Np. dlatego, że XP bardziej restrykcyjnie podchodzi do zwalniania
pamięci po obiektach. W niższych wersjach można się było dostać
do pamięci po zwolnionym obiekcie i nic się specjalnego nie działo
aż do momentu wykorzystania tego obszaru przez nowy obiekt.
Nie ośmieszaj się.
Domyślam się, że Paweł miał na myśli "niższe wersje" typu Win9x/Me,
a nie systemy NT/2k. I tam bez wątpienia takie rzeczy były "normalne".
Post by Magda S
Post by Paweł Seledec
Przecież tam jest skok! Coś chyba nie miałaś większego doświadczenia
z assemblerem i debugowaniem na poziomie kodu maszynowego.
Paweł - poczytałbyś wcześniejsze posty Magdy, to byś wiedział, że
assemblera ma w małym paluszku. A i Jej reakcja na taką uwagę była
do przewidzenia, bo to kobieta strasznie kłótliwa ;)
Post by Magda S
Zapraszam na lekcje, bezczelny dyletancie.
Normalnie, jak dzieci ;)
Widać, że oboje macie niemałą wiedzę, ale trochę pokory proszę...
z jednej i drugiej strony.


pozdr. Yankee
McP
2007-10-10 12:11:54 UTC
Permalink
Pani Moniko, Panie Pawle.

Niepotrzebnie tyle emocji. Wydawało mi się, że dość precyzyjnie opisałem
problem, z którym przyszło mi się zmierzyć. Doprecyzuję wiec.

W kodzie nie mam żadnych wstawek assemblerowych, no chyba że są w komponentach
zewnętrznych ale nie przeglądałem ich źródeł więc nie wiem.

Jak już napisałem, przerobiłem aplikację tak, że pozbyłem się FastShareMem a
cała zawartość dwóch dll (chwilowo, na potrzeby testów) trafiła do exe. Więc
temat zewnętrznego menedżera pamięci można zamknąć. Okazuje się, że nie on
wpływa na powstający błąd.

Nigdzie nie napisałem, że aplikacja działa na starszych wersjach Windows, lecz
nie działa na XP. Działa na każdej wersji za wyjątkiem tej jednej instalacji na
konkretnym komputerze. Hardware też trudno winić o błędy bo przed ponownym
postawieniem systemu aplikacja na tej konkretnej maszynie działała bez zarzutu.
Stąd moje podejrzenia o możliwość jakiejś niekompatybilności bibliotek, z
których aplikacja korzysta.

Niestety nie mogę się odnieść do tekstów o assemblerze i deassemblacji bo się na
tym kompletnie nie znam. Miałem nadzieję, że zrzut z Watsona przybliży problem i
pozwoli wskazać przyczynę komuś kto potrafi czytać te "robaczki".

Chwilowo posiadacz felernego komputera jest poza moim zasięgiem, więc nie jestem
w stanie robić żadnych testów "in-vitro" ale zanotowane zachowanie mnie martwi a
i tak kiedyś trzeba będzie rozwiązać problem.

Dziękuję wszystkim za zaangażowanie i pomoc w poszukiwaniu rozwiązania.
Zaopatrzyłem się w MemProf i czekam na kontakt z klientem.

Pozdrawiam,
McP
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Sergiusz Rozanski
2007-10-10 18:04:05 UTC
Permalink
Post by McP
Pani Moniko, Panie Pawle.
Niepotrzebnie tyle emocji. Wydawało mi się, że dość precyzyjnie opisałem
problem, z którym przyszło mi się zmierzyć. Doprecyzuję wiec.
Lepiej mieć do usenetu co innego i do poczty co innego ;)
--
*** rozanski.at.sergiusz.dot.com sq3bkn ***
*** http://www.4x4.kalisz.pl ***
* Po co głosować na tych co sami odeszli? *
$ You have new spam in /home/serek/maildir/
Loading...