Сбой приложения .NET без информации об отладке - PullRequest
6 голосов
/ 09 ноября 2010

У меня есть программа резервного копирования, которая в настоящее время работает в нашей корпоративной среде примерно на 70 машинах. Смесь ноутбуков, настольных компьютеров и Windows (XP-32, Vista-32, Vista-64, 7-32-7-64) без проблем.

Есть одно исключение, и именно поэтому я публикую здесь помощь.

На одном компьютере Dell Latitude, работающем под управлением Windows 7 64 bit с установленным .Net 4 Framework, консольное приложение будет аварийно завершать работу непосредственно перед запуском Sub Main. Он просто выдает общую ошибку Windows: «Из-за проблемы программа перестала работать правильно». без возможности просмотра отладочной информации.

Вещи, которые я пробовал:
- Удаление всего нестандартного программного обеспечения
- Комментируя несколько заявлений, которые, как я думал, могут вызвать проблемы
- Перекомпилирован для Auto CPU, x86 и x64, чтобы увидеть, если это имеет значение
- отключен антивирусный сканер
- Пользователь является администратором, но я пытался работать от имени администратора
- Добавлено первое сообщение в Sub Main, чтобы определить, где происходит сбой
- Добавлены попытки отлова для всех соответствующих кодов

Мне удалось получить немного больше информации из Просмотрщика событий:

Неисправное имя модуля: KERNELBASE.dll, версия: 6.1.7600.16385, отметка времени: 0x4a5bdbdf
Код исключения: 0xe0434f4d Смещение ошибки: 0x0000b727

Эти следующие несколько записей кажутся мне странными:

Идентификатор ошибочного процесса: 0x% 9
Время запуска ошибочного приложения: 0x% 10
Неверный путь к приложению:% 11
Недопустимый путь к модулю:% 12

Мне также удалось открыть файл .wer (плоский файл отчета об ошибках Windows), и он отрыгнул большую часть той же информации, но также включил некоторые загруженные dll и другие используемые файлы.

Спасибо, что нашли время, чтобы прочитать мою стену текста, и, надеюсь, у кого-то будет несколько идей о том, как действовать.

Джошуа

редактирование:

Я думаю о том, что следующие вызовы Win32 API могут вызывать проблемы, и они были единственными вещами, которые я не мог легко комментировать без переписывания большого кода.

Если они есть, то почему только на этой машине: (

' Obtain a handle to the console application window by passing the title of your application.
Dim hWnd As Integer = Process.GetCurrentProcess().MainWindowHandle
Dim hMenu As Integer = GetSystemMenu(hWnd, False)

'WIN API Functions to assist in disabling the Close button on the Console Window
Private Declare Function DeleteMenu Lib "user32" (ByVal hMenu As Integer, ByVal uPosition As Integer, ByVal uFlags As Integer) As Boolean
Private Declare Function GetForegroundWindow Lib "user32" () As Integer
Private Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As Integer, ByVal bRevert As Boolean) As Integer
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Integer, ByVal uCmd As Integer) As Integer
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Integer, ByVal lpString As String, ByVal nMaxCount As Integer) As Integer
Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As Integer, ByVal nCmdShow As Int32) As Boolean
Public Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, ByRef cbRemoteName As Integer) As Integer

Ответы [ 4 ]

1 голос
/ 02 февраля 2012

Я бы изменил все ваши ссылки для дескрипторов (hwnd) на IntPtr, поскольку этот тип данных будет работать в любой среде .net, но я не верю, что целочисленный тип данных будет работать в 64-битной среде для дескриптора дескриптора.

Ниже приведен фрагмент кода из статьи Microsoft:

Как правило, сборки .NET Framework, написанные на Visual Basic, будут работать одинаково независимо от платформы. Тем не менее, есть некоторые случаи, которые ведут себя по-разному на разных платформах. Эти общие случаи:

Структуры, содержащие элементы, размер которых изменяется в зависимости от платформы, например, любой тип указателя.

Арифметика указателей с постоянными размерами.

Неправильный вызов платформы или объявления COM, которые используют Integer для дескрипторов вместо IntPtr.

Приведение IntPtr к целому числу.

Использование вызова платформы или COM-взаимодействия с компонентами, которые существуют не на всех платформах.

Полный текст статьи можно найти здесь: http://msdn.microsoft.com/en-us/library/8ck8e1y2(v=vs.80).aspx

1 голос
/ 09 ноября 2010

сначала я бы посмотрел Блог Тесс Феррдандес там есть информация о создании файла отладки при сбое и просмотре его с помощью windbg

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

0 голосов
/ 10 ноября 2010

Эта ошибка иногда возникает, когда у вас есть 32-разрядные библиотеки DLL (или смешанные 32-разрядные и 64-разрядные библиотеки DLL), компилируются для любого ЦПУ и работают в 64-разрядной системе. Я знаю, что вы сказали, что пытались компилировать для x86, но попробуйте убедиться, что ВСЕ DLL являются 32-битными, а затем скомпилируйте для x86.

0 голосов
/ 09 ноября 2010

Посмотрите журнал Fusion, чтобы посмотреть, какие сборки загружаются. Возможно, не удалось найти сборку, которую он пытается загрузить.

Как включить ведение журнала ошибок привязки сборки (Fusion) в .NET

РЕДАКТИРОВАТЬ: Дикий выстрел в темноте ... Включено ли на этом аппарате быстрое переключение пользователей? Если это так, попробуйте отключить.

http://www.addictivetips.com/windows-tips/how-to-enable-disable-fast-user-switching-in-windows-xp-and-windows-vista/

...