LINUX.ORG.RU

G++: Unhandled page fault on write access to 0x00000003 at address ...


0

1

При запуске программы под Wine выдается следующее:

$ wine _cl.exe example.jpg 
wine: Unhandled page fault on write access to 0x00000003 at address 0x7bc42b3e (thread 0009), starting debugger...
Unhandled exception: page fault on write access to 0x00000003 in 32-bit code (0x7bc42b3e).
....
Backtrace:
=>1 0x7bc42b3e in ntdll (+0x32b3e) (0x0061fd78)
  2 0x7bc43811 in ntdll (+0x33811) (0x0061fd98)
  3 0x7bc43db1 RtlAllocateHeap+0xb1() in ntdll (0x0061fdf8)
  4 0x7de6d6c7 MSVCRT_malloc+0x37() in msvcrt (0x0061fe18)
  5 0x00401ab4 in _cl (+0x1ab4) (0x0061fe58)
  6 0x00403df4 in _cl (+0x3df4) (0x0061fea8)
  7 0x004010a7 in _cl (+0x10a7) (0x0061fee8)
  8 0x00401143 in _cl (+0x1143) (0x0061ff08)
  9 0x7b87a198 in kernel32 (+0x5a198) (0x0061ffe8)
  10 0xb7e98b07 wine_switch_to_stack+0x17() in libwine.so.1 (0x00000000)
Причем, нативная программа (для target-платформы i386-gcc-linux) такой ошибки не выдает.
В чем может быть причина исключения (см. выше) и какие отладочные средства порекомендуете?
Под Linux'ом до этого пользовался только отладочными printf'ами.

★★★★★

Valgrind (под linux'ом).

А вообще это ошибка работы с памятью, где-то heap поломали (вылез за пределы или ещё что), причем на линуксе/gcc все может работать, а винде/msvc падать.

Kosyak ★★★★ ()
Ответ на: комментарий от Kosyak

Хороший отладчик, этот Valgrind, мне понравился.
Выдал следующее:

==3520== Invalid write of size 1
==3520==    at 0x80493C5: TImage::Clear(unsigned char, unsigned char, unsigned char) (cl.c:380)
==3520==    by 0x804980F: TImage::CreateSharp(TImage*, int, unsigned char) (cl.c:400)
==3520==    by 0x804B5A1: main (cl.c:751)
==3520==  Address 0x4e9c608 is 0 bytes after a block of size 60,000 alloc'd
==3520==    at 0x4022D6E: malloc (vg_replace_malloc.c:207)
==3520==    by 0x80497E5: TImage::CreateSharp(TImage*, int, unsigned char) (cl.c:399)
==3520==    by 0x804B5A1: main (cl.c:751)
....
==3353== Conditional jump or move depends on uninitialised value(s)
==3353==    at 0x804A1C9: THistogram::Build(TImage*) (cl.c:165)
==3353==    by 0x804B6A8: main (cl.c:764)

1. Чтобы понять - в какой строчке кода ошибка - добавил опцию компилятора -g.
2. Первая ошибка - выход за пределы массива.
3. Вторая ошибка - использование неинициализированных переменных.

pacify ★★★★★ ()
Ответ на: комментарий от pacify

«Conditional jump or move depends on uninitialised value(s)»

Боюсь, что valgrind всегда выдает это сообщение, когда аргумент функции не задан изначально (т.е. будет обозначен после выполнения других функций.)

Ещё, конечно же, выдает кучу ошибок типа «Invalid read of size 1» при каждом использовании C-функций для работы с строками, например, strlen(const char*).

Но, к счастью, всё остальное он правильно находит :-)

blinkenlichten ()

access to 0x00000003

Неинициализированный массив.

uGin ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.