Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
You can use LGDT to load complete rubbish from the GDT record and it won't fail. You can have a valid GDT record and bogus entries in the GDT and LGDT won't fail. You can enable the protected mode bit and it won't immediately fail. The failures will occur when the processor attempt to read a selector into a segment register (ES/DS/CS/GS/FS/SS). CS in your code is set with the FAR JMP. So your code could have bad GDT table or GDT record and have set the PE bit and only start failing at the FAR JMP instruction because CS is being reloaded and the CPU needs to get the selector info from the GDT.
Update: I started writing this up before Octo posted his last comment.