Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Пашин Евгений от 27-05-2016, 08:45:57

Название: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 27-05-2016, 08:45:57
Добрый день, коллеги!

Вопрос: как можно просто искусственно вызвать фатальную ошибку AutoCAD-а для проверки отправки сообщений об ошибке?
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Вильдар от 27-05-2016, 09:08:32
Открыть объект для чтения и изменить его свойство.
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 27-05-2016, 09:54:25
Вопрос: как можно просто искусственно вызвать фатальную ошибку AutoCAD-а для проверки отправки сообщений об ошибке?
Фатальная ошибка фатальной ошибке рознь. После некоторых AutoCAD не в состоянии ничего отправить.
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 27-05-2016, 10:14:22
Кстати вот твоя же тема. Ты там вроде успешно вызывал Fatal Error (впрочем я не проверял): http://adn-cis.org/forum/index.php?topic=3038
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 27-05-2016, 10:59:41
Как вариант:

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using System.Runtime.InteropServices;
  8.  
  9. // This line is not mandatory, but improves loading performances
  10. [assembly: CommandClass(typeof(Rivilis.TestAbort))]
  11.  
  12. namespace Rivilis
  13. {
  14.   public class TestAbort
  15.   {
  16.     // For AutoCAD 2007 & 2008 & 2009
  17.     [DllImport("acdb17.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acrx_abort")]
  18.     extern static private void acrx_abort17(System.IntPtr last);
  19.     // For AutoCAD 2010 & 2011 & 2012
  20.     [DllImport("acdb18.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acrx_abort")]
  21.     extern static private void acrx_abort18(System.IntPtr last);
  22.     // For AutoCAD 2013 & 2014
  23.     [DllImport("ac1st19.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acrx_abort")]
  24.     extern static private void acrx_abort19(System.IntPtr last);
  25.     // For AutoCAD 2015 & 2016
  26.     [DllImport("ac1st20.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acrx_abort")]
  27.     extern static private void acrx_abort20(System.IntPtr last);
  28.     // For AutoCAD 2017
  29.     [DllImport("ac1st21.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "acrx_abort")]
  30.     extern static private void acrx_abort21(System.IntPtr last);
  31.  
  32.     [CommandMethod("Abort")]
  33.     public void Abort()
  34.     {
  35.       switch (Application.Version.Major)
  36.       {
  37.         case 17: acrx_abort17(IntPtr.Zero); break;
  38.         case 18: acrx_abort18(IntPtr.Zero); break;
  39.         case 19: acrx_abort19(IntPtr.Zero); break;
  40.         case 20: acrx_abort20(IntPtr.Zero); break;
  41.         case 21: acrx_abort21(IntPtr.Zero); break;
  42.       }
  43.     }
  44.   }
  45. }
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 27-05-2016, 12:34:40
Кстати вот твоя же тема. Ты там вроде успешно вызывал Fatal Error

В этом и загвоздка, сейчас у меня ничего не фаталит :) Ирония какая-то.

А вот ваш пример ой как здорово фаталит :) За что Вам спасибо, но вот только у меня форма для отправки сообщений что-то не появляется, хотя REPORTERROR=1

Можно как-то форму для отправки сообщений выудить?
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 27-05-2016, 12:42:25
Открыть объект для чтения и изменить его свойство.

Извиняюсь, пролетел это сообщение, а это какой еще такой объект? И какой свойство именно?
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Вильдар от 27-05-2016, 12:51:24
Любой объект чертежа.
Код - C# [Выбрать]
  1.    var btrBl = t.GetObject(idBlBtr, OpenMode.ForRead) as BlockTableRecord;
  2.    btrBl.Name = "123"
  3.  
Правда, я не пробовал, просто частенько такой тип ошибок допускаю. Будет ли при этом фатал не знаю, но ошибка - точно.
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 27-05-2016, 14:11:39
Правда, я не пробовал, просто частенько такой тип ошибок допускаю. Будет ли при этом фатал не знаю, но ошибка - точно.

Надеюсь поможет :)
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Дмитрий Загорулькин от 27-05-2016, 14:20:14
Вызвать фатал - это проблема :)
Выход за границы массива:
Код - C# [Выбрать]
  1. int[] intArray = new int[0];
  2. intArray[0]=0;
Попытка добавить в словарь имеющийся ключ:
Код - C# [Выбрать]
  1. Dictionary<int, int> dict = new Dictionary<int, int>();
  2. dict.Add(0,0);
  3. dict.Add(0,0);
Объекта нет:
Код - C# [Выбрать]
  1. Document adoc=null;
  2. Database db=adoc.Database;
Попытка открыть объект без транзакции:
Код - C# [Выбрать]
  1. // Тут можно id любого объекта брать
  2. ObjectId id = ent.Id;
  3. // Транзакций открытых быть не должно!
  4. DBObject obj = id.GetObject(OpenMode.ForRead);


Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 27-05-2016, 14:29:09
vildar82, Дмитрий Загорулькин

Ребята, а вы не путаете Fatal Error с обычным Exception:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F35827%2F7842324.6%2F0_126494_e457fe66_orig.png&hash=33eeb1a2de43170bc157b638f3748346)

???
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Дмитрий Загорулькин от 27-05-2016, 14:38:37
Хм, надо проверять. Возможно, где-то и не упадет автокад. У меня обычно даже если выскакивает сообщение об исключении, жмешь "Продолжить" и автокад все равно падает :)
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 27-05-2016, 14:57:11
Вот так будет лучше и с собственной диагностикой об ошибке:

Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using System.Runtime.InteropServices;
  8.  
  9. [assembly: CommandClass(typeof(Rivilis.TestAbort))]
  10.  
  11. namespace Rivilis
  12. {
  13.   public class TestAbort
  14.   {
  15.     // For AutoCAD 2007 & 2008 & 2009
  16.     [DllImport("acdb17.dll", CallingConvention = CallingConvention.Cdecl,
  17.       CharSet = CharSet.Unicode, EntryPoint = "acrx_abort")]
  18.     extern static private void acrx_abort17(string fmt, __arglist);
  19.     // For AutoCAD 2010 & 2011 & 2012
  20.     [DllImport("acdb18.dll", CallingConvention = CallingConvention.Cdecl,
  21.       CharSet = CharSet.Unicode, EntryPoint = "acrx_abort")]
  22.     extern static private void acrx_abort18(string fmt, __arglist);
  23.     // For AutoCAD 2013 & 2014
  24.     [DllImport("ac1st19.dll", CallingConvention = CallingConvention.Cdecl,
  25.       CharSet = CharSet.Unicode, EntryPoint = "acrx_abort")]
  26.     extern static private void acrx_abort19(string fmt, __arglist);
  27.     // For AutoCAD 2015 & 2016
  28.     [DllImport("ac1st20.dll", CallingConvention = CallingConvention.Cdecl,
  29.       CharSet = CharSet.Unicode, EntryPoint = "acrx_abort")]
  30.     extern static private void acrx_abort20(string fmt, __arglist);
  31.     // For AutoCAD 2017
  32.     [DllImport("ac1st21.dll", CallingConvention = CallingConvention.Cdecl,
  33.       CharSet = CharSet.Unicode, EntryPoint = "acrx_abort")]
  34.     extern static private void acrx_abort21(string fmt, __arglist);
  35.  
  36.     [CommandMethod("Abort")]
  37.     public void Abort()
  38.     {
  39.       int ver = Application.Version.Major;
  40.       switch (ver)
  41.       {
  42.         case 17: acrx_abort17("Rivilis Error in AutoCAD 2007...2009: R%d",
  43.           __arglist(ver)); break;
  44.         case 18: acrx_abort18("Rivilis Error in AutoCAD 2010...2012: R%d",
  45.           __arglist(ver)); break;
  46.         case 19: acrx_abort19("Rivilis Error in AutoCAD 2013...2014: R%d",
  47.           __arglist(ver)); break;
  48.         case 20: acrx_abort20("Rivilis Error in AutoCAD 2015...2016: R%d",
  49.           __arglist(ver)); break;
  50.         case 21: acrx_abort21("Rivilis Error in AutoCAD 2017...201X: R%d",
  51.           __arglist(ver)); break;
  52.       }
  53.     }
  54.   }
  55. }

Обратите на ключевое слово __arglist, которое соотвествует в C++ передаче переменного числа аргументов va_args

Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 30-05-2016, 06:56:12
Выглядит фантастически!

Вот только я у себя не могу то же самое запустить... может я что-то забыл подключить?!

Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 09:42:00
Ты компиляцию запустил или просто смотришь на подчеркнутые функции?
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 30-05-2016, 11:01:05
Ты компиляцию запустил или просто смотришь на подчеркнутые функции?

Мне стыдно, Александр Наумович... но всё равно фаталит без окна отправки сообщений. Может у Вас какая-то переменная стоит.
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 12:26:12
Мне стыдно, Александр Наумович... но всё равно фаталит без окна отправки сообщений. Может у Вас какая-то переменная стоит.
Нет. В какой версии AutoCAD и с какой версией студии проверяешь? Разве что REPORTERROR равно 1
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 12:29:24
Ты компиляцию запустил или просто смотришь на подчеркнутые функции?

Мне стыдно, Александр Наумович... но всё равно фаталит без окна отправки сообщений. Может у Вас какая-то переменная стоит.
И вообще запиши видео (как у меня написано в подписи).
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 30-05-2016, 13:14:38
AutoCAD 2014, 64bit
Visual Studio 2013

Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 30-05-2016, 13:16:48
REPORTERROR равно 1

У меня тоже 1
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 13:47:35
А ты уверен, что у тебя не появилось окно отправки сообщения (возможно в фоне и ты его не видишь).
Вот AutoCAD 2014 x64 и компилировал в VS 2013:



И вообще объясни зачем это тебе нужно?
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 13:54:12
Ну и на всякий случай AutoCAD 2014 English x64:


Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 14:01:27
А вообще-то есть чисто .NET-овский способ:

Код - C# [Выбрать]
  1. [CommandMethod("FatalError")]
  2. public void FatalError()
  3. {
  4.   HostApplicationServices.Current.FatalError("Rivilis Error");
  5. }

Надеюсь, что хоть он у тебя сработает...
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 30-05-2016, 15:17:38
И вообще объясни зачем это тебе нужно?

Это нужно моему начальнику. Он и Александр Бевс (из Autodesk support) что-то тестируют CER-скриптом. Я не очень осведомлён для чего это, но их задача протестировать автоматическую отправку сообщений об ошибках ПО Autodesk.
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 30-05-2016, 15:19:08
Надеюсь, что хоть он у тебя сработает

Попробую перезагрузить компьютер!!! А то он также работает :) Я Вам, Александр Наумович, наверное уже надоел.

Вот ведь незадача, когда надо его нет...
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 30-05-2016, 15:32:12
(возможно в фоне и ты его не видишь)

Не вижу ничего кроме AdSync.exe
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Пашин Евгений от 30-05-2016, 15:36:55
Попробую другими средствами, получится - отпишусь. И спасибо!
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 15:47:24
Попробую другими средствами, получится - отпишусь.
Другими - это какими? И вообще попроси народ потестировать мой код. Может это только у тебя не работает...
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Windcastle от 30-05-2016, 17:11:48
И вообще попроси народ потестировать мой код. Может это только у тебя не работает...

Александр Наумович, спасибо огромное!!!

Похоже что только у меня и не работает!!! У остальных окно сразу вывалилось. Даже на виртуальной машине.

Сразу вопрос по поводу того, что окно не выходило на рабочем компе: а может ли это быть как-то связано с тем, что у меня на компьютере установлены разные версии автокадовских линеек (Civil 3D, Plant, P&ID, Electrical и еще в разных версиях 2014, 2016)???

Домашний комп:
AutoCAD 2016, 64bit
Windows 7, 64 bit
Visual Studio 2012 сработало на ура!!!

Завтра зайду от имени Пашина Евгения и отмечу как решение!!!
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Windcastle от 30-05-2016, 17:18:17
Другими - это какими?

Да есть тут одна недоработка у СПДС графикс со вставкой объектов в чертежи... иногда фаталит, при попытке сменить какое-нибудь свойство у форматки :)
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Windcastle от 30-05-2016, 17:21:09
А вообще-то есть чисто .NET-овский способ:

Код - C# [Выбрать]
[CommandMethod("FatalError")]
public void FatalError()
{
  HostApplicationServices.Current.FatalError("Rivilis Error");
}

Надеюсь, что хоть он у тебя сработает...


Это метод тоже работает!!! Какой из них отметить?
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Вильдар от 30-05-2016, 17:23:42
Фаталит хорошо, с репортом  ;)
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 20:33:36
Сразу вопрос по поводу того, что окно не выходило на рабочем компе: а может ли это быть как-то связано с тем, что у меня на компьютере установлены разные версии автокадовских линеек (Civil 3D, Plant, P&ID, Electrical и еще в разных версиях 2014, 2016)???
Как видишь я видео писал и с AutoCAD 2014 Rus/Eng и AutoCAD 2016 Eng, а проверял вообще начиная с 2012 по 2017. В вертикалках не проверял. В принципе это может быть их особенность. Но на чистый AutoCAD они влиять не должны.
Это метод тоже работает!!! Какой из них отметить?
Я уже отметил именно этот как решение, так как он чисто .NET-овский и намного проще. Вообще-то они должны работать одинаково.
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 30-05-2016, 20:34:38
Фаталит хорошо, с репортом  ;)
Спасибо. А то у меня уже начало складываться впечатление, что правильно работает только у меня.
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Вильдар от 27-01-2017, 19:28:32
А можно как-то фиксировать (логировать) фатальную ошибку?
Из приложения загруженного в автокад.
Например, при следующем запуске автокада, можно узнать, что перед этим был фатал?
Название: Re: Как искусственно вызвать фатальную ошибку AutoCAD-а?
Отправлено: Александр Ривилис от 27-01-2017, 20:33:16
Средствами ObjectARX теоретически можно - в нём есть недокументированная функция установки своего обработчика Fatal Error. А вот средствами AutoCAD .NET API крайне мало вероятно.