2013-04-09 3 views
-5

Я должен отлаживать приложение, созданное с использованием Delphi CodeGear 2009, которое было создано кем-то другим, кроме меня, и этот человек больше не является частью компании.Ошибка при создании общей памяти

Странная проблема, когда я загрузить проект в код передачи и запустить программное обеспечение, которое должно реально работать, я получаю сообщение об ошибке:

Первый шанс исключение в $ 753CB9BC. Класс исключения Исключение с сообщением Ошибка создания общей памяти Global \ {B40FBC0C-FEBD-11DD-B3EA-FC6656D89593} (5) '. Процесс OrderCenter.exe (836268)

Я не могу даже запустить программу в пошаговом режиме, то, кажется, происходит, прежде чем я даже попасть в само приложение RAN. Я понятия не имею, как исправить эту ошибку, я уверен, что могу посмотреть на код и понять его и, возможно, изменить его, но я точно не понимаю, как исправить ошибку, например без какой-либо документации по Google. Я пробовал просматривать google и SO некоторое время, пытаясь разного рода комбинации ключевых слов, и ничего не выходит из этого.

Как я могу отладить это? С чего начать?


Редактировать # 1

Чтобы уточнить, я получаю исключение, прежде чем даже входя в приложение, и это даже не отладке. Я с удовольствием вставлю трассировку стека как можно скорее, чтобы каждый мог увидеть, где он сбой. Извиняюсь за то, что не подумал об этом изначально.

Я искал точное сообщение об ошибке в Google, но я не нашел ничего полезного. Вот несколько примеров:

http://www.google.ca/#hl=fr&output=search&sclient=psy-ab&q=Error+creating+shared+memory&oq=Error+creating+shared+memory

http://www.google.ca/#hl=fr&sclient=psy-ab&q=delphi+Error+creating+shared+memory&oq=delphi+Error+creating+shared+memory


Edit # 2

Спасибо за человека, который нашел время, чтобы указать, была какая-то процедура инициализации, я искал во всех файлах и обнаружил эту процедуру и обнаружил, что код здесь сбой:

if not AlreadyRunning(ProcessName, TFormMain, False, False, True) then 

Если я попытаюсь просмотреть объявление этого кода, похоже, что он действительно пытается создать объект глобальной общей памяти, вероятно, какой-то Mutex, чтобы предотвратить двойную инициализацию.

Мое первое предположение: я, возможно, просто отрубаю эту часть кода без каких-либо прямых последствий, кроме того, что теперь пользователь сможет запускать 2+ приложения.

На боковой ноте, Интересно, почему это в первую очередь потерпит поражение (Win7, учетная запись администратора)?

PS: Причина, по которой я не смог найти место происшествия вначале, состоял в том, что приложение находилось в режиме деблокирования, а не в режиме отладки, мне потребовалось некоторое время и глубокий поиск пользовательского интерфейса, чтобы заметить его в конфигурации сборки в файловом менеджере. Ничто другое не указывало мне, что я был в режиме освобождения, пока я не попытался поставить точки останова в части инициализации приложения, и это не остановится ...

ответ

0

Я отправил этот ответ, потому что изменения в вопросе затрудняют понимание истории. Совет Hat для Дэвида для понимания смысла сообщения об исключении, не видя кода, и объясняя это новому парню на блоке, OP.

Похоже, что с помощью Дэвида вы обнаружили код, который предотвращает запуск повторяющихся экземпляров кода. Если вы его удалите, вы, скорее всего, не понесете другие штрафы, но поскольку мы не можем читать ваш код, мы не можем вам точно это сказать.Также я должен отметить, что концепция режимов выпуска и отладки ослепительно очевидна для разработчиков на языке (C++ и Delphi) и, возможно, более тонкой для тех, кто не знаком с компиляторами и собственным кодом. Возможно, вам стоит получить книгу о Delphi, если вы собираетесь поддерживать приложение Delphi. Там больше драконов, и воды становятся очень быстрыми, если это ваш первый скомпилированный/родной язык.

Скорее всего, это код, который умирает является элементом, который был либо:

(а) скопировали и вставили из некоторого поваренной книги общих DELPHI методов, или

(б) Часть компонента или класса что даже не было написано оригинальным автором

Этот код может иметь ошибки, вызванные перемещением этого кода компонента, написанного, например, Delphi 5, в 1998 году, в Windows NT, так что он больше не функционирует в Delphi XE3, на WIndows 7 или 8. Это явление не уникально для delphi и называется «бит-гниль». Другими словами, среда - это немного движущаяся цель, и старый код часто ломается вот так. Исправление этого без знания Delphi, или API-интерфейсов Win32, программистом PHP, было бы похоже на то, что автомеханик делает операцию на моей печени. Я бы не дал парням шансы.

Тем не менее, вот план:

A. Комментарий это.

B. Продолжайте тестирование!

Эй, извините, что вы стреляете в меня, теперь мы даже! ;-)

+0

Нет проблем, на самом деле, я думаю, причина, по которой я так сильно ненавижу это приложение из-за того, что нет здесь на рабочем столе Delphi больше, что я застреваю, пытаясь понять IDE, что я не привык к , смешанный с чувством срочности, никакой документации вообще, босс в отпуске для отпуска по уходу за ребенком ..., который много разбирается со всеми сразу ... –

+3

Нанять подрядчика. (Nudge nudge, подмигните.) –

+0

Я прокомментировал несколько частей приложения, которые, похоже, вызывают ошибку приложения, у меня уже есть соединения mysql, ссылающиеся на несуществующие серверы и базу данных, код, который перестает работать, когда он был раньше, и т. Д. bla bla bla, хорошая неделя! –

15

Ошибка возникает специально в вашей программе. Это можно выделить из этого сообщения:

Исключение класса Exception с сообщением «Ошибка создания разделяемой памяти Global \ {B40FBC0C-FEBD-11DD-B3EA-FC6656D89593} (5)

То есть все отличительные признаки исключения, вызванного программой Delphi. Шестнадцатеричная цифра указана в $, а не 0x, и первые слова сообщения являются стандартными Delphi. Я собираюсь предположить, что именно ваша программа вызывает это исключение.

Прежде всего, класс исключений - Exception. Насколько мне известно, ничто в RTL или каких-либо уважаемых сторонних библиотеках не вызывает исключения класса Exception. Это считается плохой практикой. Всегда поднимайте подкласс класса Exception. Ergo, код вашего приложения поднимает это исключение.

Во-вторых, сообщение описывает ошибку при создании разделяемой памяти и дает именованный объект в пространстве имен Global. Это, вероятно, именованный объект сопоставления файлов.

И, наконец, сообщение содержит код ошибки Win32, полученный по вызову GetLastError. Этот код - номер 5, наш старый друг ERROR_ACCESS_DENIED.

Таким образом, кажется, что эта программа работает в тандеме с отдельным процессом, и связь осуществляется с использованием общей памяти, сопоставления файлов. И по какой-либо причине безопасность для этого сопоставления файлов не установлена ​​правильно.

Объект был помещен в пространство имен Global, что и является тем, что вы делаете, если вам нужно, чтобы он делился между сеансами. Поэтому представляется правдоподобным, что другой процесс находится в службе в сеансе 0. Возможно, атрибуты безопасности, необходимые для защиты объекта для межсетевого доступа, не были правильно указаны.

Код, который вызывает исключение будет выглядеть немного как это:

FileMapping := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, 
    False, PChar(FileMappingName)); 
if FileMapping=0 then 
    raise Exception.CreateFormat(
    'Error creating shared memory %s (%d)', 
    [FileMappingName, GetLastError] 
); 

Это все, что я могу сказать, из представленных доказательств. Но теперь вы знаете, что искать в своей программе, чтобы найти код, который терпит неудачу. К тебе.

+2

Отличные работы по расследованию, Дэвид. Очень хорошо сделано. –

+2

Я проголосовал за повторное открытие, исходя из качества и полезности ответа. Это может быть хорошей возможностью для одной из этих «разворотных» медалей, если ОП позаботится о том, чтобы улучшить вопрос ... –

+1

Человек, который даже не может найти место, где возникает исключение в Delphi, задает слишком узко определенный вопрос чтобы быть полезным здесь. Помогите моей ноге болеть, пожалуйста, помогите мне выяснить, какой калибр пули положил дыру в мой ботинок, пожалуйста. Kthxbye. –

Смежные вопросы