Почему я получаю отсутствующие ошибки DLL при отладке моего кода на Fortran с помощью GDB в 64-битной Windows 7 (с использованием Eclipse / Photran / Cygwin)? - PullRequest
1 голос
/ 21 октября 2010

Моя настройка следующая:

  • ОС: Windows 7 Home Premium 64-битная
  • Eclipse: Helios 3.6.1 64-bit с CDT и фотран
  • Java SE Runtime Окружающая среда: 1.6.0_21
  • Горячая точка Java: 64-битная виртуальная машина сервера (сборка 17.0-b17, смешанный режим)
  • Cygwin 1.7.2 (32-разрядная версия)

Мое первоначальное тестовое приложение на Fortran просто печатает «Hello World!» и выходит. Код создается и работает нормально, хотя со следующими 2 предупреждениями на вкладке «Проблемы» в Eclipse

Description Resource    Path    Location    Type
Error launching external scanner info generator (gcc -E -P -v -dD C:/Users/Joe/workspace/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c)  HelloFortran    Unknown C/C++ Problem
Error launching external scanner info generator (gcc -E -P -v -dD C:/Users/Joe/workspace/.metadata/.plugins/org.eclipse.cdt.make.core/specs.c)  HelloFortran    Unknown C/C++ Problem

Проблема возникает при попытке отладки приложения как локального приложения на Fortran, что приводит к этой ошибке:

cygwin warning:
  MS-DOS style path detected: C:\Users\Joe\workspace\HelloFortran
  Preferred POSIX equivalent is: /cygdrive/c/Users/Joe/workspace/HelloFortran
.gdbinit: No such file or directory.
  CYGWIN environment variable option "nodosfilewarning" turns off this warning.
  Consult the user's guide for more details about POSIX paths:
    http://cygwin.com/cygwin-ug-net/using.html#using-pathnames
auto-solib-add on
Undefined command: "auto-solib-add".  Try "help".
Error: dll starting at 0x76ba0000 not found.
Error: dll starting at 0x75230000 not found.
Error: dll starting at 0x76ba0000 not found.
Error: dll starting at 0x76aa0000 not found.
[New thread 7060.0x10dc]
[New thread 7060.0x16c0]

Я предполагаю, что точки входа не найдены, потому что он ожидает 32- / 64-битную DLL и получает другой тип (поправьте меня, если я ошибаюсь). Версия GDB выглядит следующим образом:

GNU gdb 6.8.20080328 (cygwin-special)
GDB configured as "i686-pc-cygwin"

Запуск GDB из командной строки дает:

[New thread 5768.0x15a0]
Error: dll starting at 0x76ba0000 not found.
Error: dll starting at 0x75230000 not found.
Error: dll starting at 0x76ba0000 not found.
Error: dll starting at 0x76aa0000 not found.
[New thread 5768.0x46c]
hellofortran () at ../HelloFortran.f90:1
1    program HelloFortran
Current language: auto; currently fortran

Если я правильно читаю, приложение работает в GDB, и я могу пройти через него, но о чем пропадают ошибки DLL?

Dependency Walker выдает следующие ошибки для моего HelloFortran.exe

Error: Modules with different CPU types were found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

Похоже, что отсутствующие библиотеки DLL - это IESHIMS.DLL (2), что, исходя из моих быстрых исследований, не кажется большой проблемой, но я не вижу причин, по которым мое приложение должно ссылаться на эту библиотеку DLL, поэтому я не думаю, что это приводит к ошибкам в GDB.

Все модули имеют тип процессора x64, кроме:

CYGGCC_S-1.DLL
CYGGFORTRAN-3.DLL
CYGWIN1.DLL
HELLOFORTRAN.EXE

с типом процессора x86

Я обеспокоен тем, что отсутствующие ошибки DLL могут негативно отразиться на моей способности правильно отлаживать программу (хотя программа в конечном итоге будет работать на HPC на основе Unix, поэтому я не должен сталкиваться с этими проблемами, поскольку все эти библиотеки DLL кажутся делать с Cygwin).

Мои вопросы:

  • Почему я получаю пропущенные ошибки DLL? (Исправит ли это переход на 32-разрядные версии Eclipse / JVM и т. Д.?)
  • Я хорошо, чтобы продолжить, или я должен решить недостающие ошибки DLL (и если да, как)?

Редактировать: Моя тестовая программа выглядит следующим образом:

program HelloFortran
    ! Force variable declaration
    implicit none

    ! Print 'Hello World!' to the main output
    write (*,*) 'Hello World!'

    ! End program
end program HelloFortran

1 Ответ

2 голосов
/ 21 октября 2010

Почему я получаю пропущенные ошибки DLL?

Когда Win / x64 отправляет DebugEvent 32-битному процессу о 64-битной DLL, являющейся частью этого процесса, он обязательно усекает адрес загрузки (64-битный адрес загрузки не вписывается в 32-битный LPVOID). Конечным результатом является то, что отладчик видит событие загрузки DLL, но не может найти никакой DLL по этому адресу; так предупреждает вас.

(Исправит ли это переключение на 32-разрядные версии Eclipse / JVM и т. Д.?)

Нет: это принципиально важно для отладки любого 32-разрядного процесса на x64 (по крайней мере, с 32-разрядным отладчиком). Я думаю вы бы избавились от предупреждения, если бы использовали x64-версию GDB, но я не уверен, что GDB / x64 может отлаживать 32-битные процессы в Windows (x86_64 GDB не имеет проблем с процессами i386 в Linux из-за поддержки «multi-arch»; я не знаю, присутствует ли «multi-arch» в версии Windows).

Я обеспокоен тем, что отсутствующие ошибки DLL могут повредить моей способности правильно отлаживать программу

Не должно быть.

Я не вижу причин, по которым в моей заявке должна быть ссылка IESHIMS.DLL

Что заставило вас думать, что это IESHIMS.DLL?

Скорее всего, вы видите WoW64.dll и друзей. Каждое 32-разрядное приложение, работающее на ссылках Win / x64 WoW64.

...