В зависимости от того, во сколько средство сохранения значит для Вас...
Добавление TODO и FIXME в комментарии автоматически добавляют задачу к списку задач в Eclipse. Таким образом, если существует код, Вы хотите возвратиться к, сказать, что Вы отлаживали и потребность провести некоторое исследование, можно сделать...
FIXME означает, что это срочно, который помещает красный! в окне
задачи TODO нормальная безотлагательность
//FIXME: This accidentally deletes user accounts
user.account().delete();
//TODO: Add some validation before assigning everyone as admin
user.setPrivilege("Admin");
И затем существуют методы set/методы считывания, автоматически создаваемые. Здорово, если Вы создаете боб или что-то. Скажите объявление класса, такого как:
public class SomeBean {
private static int FIRST_VALUE = 0;
private static int SECOND_VALUE = 1;
...
private static int THOUSANDTH_VALUE = 1000;
}
можно создать все переменные, затем щелкнуть правой кнопкой в редакторе, перейдите к Источнику и затем выберите, Генерируют Методы set & Методы считывания. Это автоматически создаст их для Вас.
Well...how would you define "pure .NET"? I played with CLR2/delegate/GCHandle/array when I read the "how to crash JVM" post, and came up with something like this:
using System;
using System.Reflection;
using System.Runtime.InteropServices;
namespace TestCLR2Crash {
static void Main( string[ ] args ) {
// declare a delegate that refers to a static method,
// in this case it's a static method generated from the
// anonymous delegate.
Action action = delegate( ) { };
// "generate" code into an array of uint
var fakeDelegate = new uint[ ] {
// dummy values
0x00000000, 0x00000000,
// fake _methodPtrAux
0x00000000,
// native code/string
0x6AEC8B55, 0x2FD9B8F5, 0xD0FF7C81, 0x006A006A,
0x00E81F6A, 0x83000000, 0x50102404, 0x81CC5DBA,
0x8BD2FF7C, 0x47C35DE5, 0x74656572, 0x73676E69,
0x6F726620, 0x6567206D, 0x6172656E, 0x20646574,
0x65646F63, 0x00000A21
};
// fill in the fake _methodPtrAux,
// make it point to the code region in fakeDelegate
var handle = GCHandle.Alloc( fakeDelegate, GCHandleType.Pinned );
var addr = handle.AddrOfPinnedObject( );
const int sizeOfUInt32 = sizeof( uint ); // 4
const int indexOfCode = 3;
fakeDelegate[ 2 ] = Convert.ToUInt32( addr.ToInt32( ) + sizeOfUInt32 * indexOfCode );
var targetInfo = typeof( Action )
.GetField( "_target", BindingFlags.NonPublic | BindingFlags.Instance );
targetInfo.SetValue( action, fakeDelegate );
action( ); // Greetings from generated code!
Console.WriteLine( "Greetings from managed code!" );
handle.Free( );
}
}
}
It's only known to work on 32-bit Windows XP with CLR2 on x86; and also known not to work with Vista and Windows 7 and the like, where DEP+ASLR is on by default.
The point of fun about the code above is that it didn't explicitly use unsafe code (although GCHandle.Alloc(..., GCHandleType.Pinned) demands security privilege), yet it manages to fake an array into a delegate instance, and calls into the x86 machine code within the array. The code itself is pure C#, if you don't count the embedded x86 code as some "foreign language" ;-) В основном он использует внутреннюю реализацию делегатов CLR2 для статических методов, так что несколько частных членов Delegate фактически являются внутренними указателями. Я запихнул код x86 в массив, который размещен в управляемой куче. Итак, чтобы это работало, DEP не должен быть включен, иначе нам придется найти другой способ получить привилегию выполнения на этой странице памяти.
Код x86 выглядит следующим образом: (в синтаксисе псевдо-MASM)
55 push ebp
8BEC mov ebp,esp
6A F5 push -0B ; /DevType = STD_OUTPUT_HANDLE
B8 D92F817C mov eax,KERNEL32.GetStdHandle ; |
FFD0 call eax ; \GetStdHandle
6A 00 push 0 ; /pReserved = NULL
6A 00 push 0 ; |pWritten = NULL
6A 1F push 1F ; |CharsToWrite = 1F (31.)
E8 00000000 call <&next_instruction> ; |
830424 10 add dword ptr ss:[esp],10 ; |Buffer
50 push eax ; |hConsole
BA 5DCC817C mov edx,KERNEL32.WriteConsoleA ; |
FFD2 call edx ; \WriteConsoleA
8BE5 mov esp,ebp
5D pop ebp
C3 ret
Это НЕ поведение, определенное CLI, и оно не будет работать в других реализациях CLI, таких как Mono. Есть и другие способы заставить аналогичную логику работать в Mono, они уже пробовали это в Ubuntu 9.04 w / Mono 2.4 и работали.
Я написал об этом сообщение в блоге здесь: http: //rednaxelafx.javaeye. com / blog / 461787
Это на китайском языке, но есть ' Там много кода, который должен объяснить, что я сделал. Используя тот же прием, в конце сообщения в блоге я показал несколько примеров того, как можно настроить приведенный выше код, чтобы что-то пошло не так, например, получить SEHException.
Я сделал это только сегодня. Я тестировал установку более крупного проекта .net. Отсутствовала сборка, содержащая некоторые интерфейсы, и exe просто перестает работать. Среда выполнения не обнаружила никаких исключений.
Вы можете быть уверены, что в среде выполнения еще больше ошибок - просто посчитайте миллионы строк кода ...
Орен Эйни обнаружил ошибку в инфраструктуре .net, которая вызвала исключение ExecutionEngineException - в основном сбой среды выполнения.
Вы можете прочитать об этом здесь (Microsoft Connect):
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=384781
И, несмотря на «закрытое» состояние ошибки, она еще не исправлена.
Я видел, как Java-программы вылетали из JVM, загружая несуществующий класс и игнорируя ClassNotFoundError
, а затем продолжая выполнение, как будто ничего не произошло. Возможно, вы могли бы сделать что-то подобное при динамической загрузке класса .NET.
Я знаю, что вы можете вывести из строя весь свой компьютер с помощью .NET. Но это включает в себя бесконечный цикл и приоритет процесса RealTime ...