Как искусственно вызвать фатальную ошибку AutoCAD-а?

Автор Тема: Как искусственно вызвать фатальную ошибку AutoCAD-а?  (Прочитано 20837 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый день, коллеги!

Вопрос: как можно просто искусственно вызвать фатальную ошибку AutoCAD-а для проверки отправки сообщений об ошибке?

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Открыть объект для чтения и изменить его свойство.

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопрос: как можно просто искусственно вызвать фатальную ошибку AutoCAD-а для проверки отправки сообщений об ошибке?
Фатальная ошибка фатальной ошибке рознь. После некоторых AutoCAD не в состоянии ничего отправить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Кстати вот твоя же тема. Ты там вроде успешно вызывал Fatal Error (впрочем я не проверял): http://adn-cis.org/forum/index.php?topic=3038
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Как вариант:

Код - 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. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Кстати вот твоя же тема. Ты там вроде успешно вызывал Fatal Error

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

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

Можно как-то форму для отправки сообщений выудить?

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Открыть объект для чтения и изменить его свойство.

Извиняюсь, пролетел это сообщение, а это какой еще такой объект? И какой свойство именно?

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Любой объект чертежа.
Код - C# [Выбрать]
  1.    var btrBl = t.GetObject(idBlBtr, OpenMode.ForRead) as BlockTableRecord;
  2.    btrBl.Name = "123"
  3.  
Правда, я не пробовал, просто частенько такой тип ошибок допускаю. Будет ли при этом фатал не знаю, но ошибка - точно.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Правда, я не пробовал, просто частенько такой тип ошибок допускаю. Будет ли при этом фатал не знаю, но ошибка - точно.

Надеюсь поможет :)

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Вызвать фатал - это проблема :)
Выход за границы массива:
Код - 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);



Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
vildar82, Дмитрий Загорулькин

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



???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Хм, надо проверять. Возможно, где-то и не упадет автокад. У меня обычно даже если выскакивает сообщение об исключении, жмешь "Продолжить" и автокад все равно падает :)

Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Вот так будет лучше и с собственной диагностикой об ошибке:

Код - 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

« Последнее редактирование: 28-05-2016, 15:09:56 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Выглядит фантастически!

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


Онлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ты компиляцию запустил или просто смотришь на подчеркнутые функции?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение