sharepoint saturday belgium 2014 - production debugging of sharepoint applications

47
Production debugging of SharePoint applications #SPSBEUK Wouter van Vugt April 26 th , 2014

Upload: biwug

Post on 21-Jan-2015

350 views

Category:

Technology


1 download

DESCRIPTION

 

TRANSCRIPT

Page 1: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Production debugging of SharePoint applications

#SPSBEUKWouter van VugtApril 26th, 2014

Page 2: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Thanks to our sponsors!

Gold

Silver

Page 3: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Agenda• .NET and CLR primer• Optimizing code and the effect on debuggers• Debugging third party code

Page 4: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

.NET and CLR primer

Page 5: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

.NET Applications• Written in any language• Executed in a runtime called CLR

Shield code from hardware specifics Java: One language, multi OS .NET: Many languages, one OS (and Mono)

Allows various types of preprocessing of code

OS

CLR

App

Page 6: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Common Language Runtime

Operation

• Memory management

• Thread synchronization

• Error handling• Type Safety

Security

• Code Access Security

• Data Execution Prevention (OS)

• Address Space Layout Randomization (OS)

Execution

• Intermediate Language

Page 7: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Type Safety• Type Safety

A pointer of a specific type can never point to an object which is not of that type!

Checked at compile AND runtime! Knowing the actual type enables

Reading its data Quite useful in debugging Calling its functions

Car c = new Person()

‘Pointer type’ Pointer Object type

Page 8: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Circumventing type safetyDemo

Page 9: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Creating .NET Applications

C#, C++, VB.NET,

F#.... (40+)

Module

PDB

Compile LinkAssembly

PDB

Page 10: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Executing code

• Assemblies contain mostly IL code IL is the ‘Machine code’ for .NET Compiled to native instructions at runtime

through the JIT Compiler Enough information remains to decompile back to

source!

C#Machine

Code

Language richness compared

IL

Page 11: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Executing code with JIT Compilation

Console.WriteLine("Hi");Console.WriteLine("There"

);

JIT Compiler-Lookup IL for method-Compile IL to native-Modify metadata to point to compiled code-Jump to compiled code

Console metadata

static void WriteLine(string)

JIT Compiler Address

static void WriteLine()

JIT Compiler Address

Native CPU Instruction

s

Native Address

Page 12: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Executing code with JIT Compilation

Console.WriteLine("Hi");Console.WriteLine("There"

);

Console metadata

static void WriteLine(string)

JIT Compiler-Lookup IL for method-Compile IL to native-Modify metadata to point to compiled code-Jump to compiled code

Native Address

static void WriteLine()

JIT Compiler Address

Native CPU Instruction

s

Page 13: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Code optimization

• Compile-time Constant value folding Remove Branch to

next instruction and NOP instructions used to break on control flow, {, }, EndIf etc

Overflow checking …

• During JIT Eliminate local variables Range check elimination Method inlining Tail call optimization Common subexpression

elimination Dead code elimination Loop unrolling …

Page 14: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Running non optimized code

• Breakpoints • Edit and continue

Page 15: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

C# Compiler – Variable Generation

Page 16: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

C# Compiler – Variable GenerationDebug Release

Page 17: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

C# Compiler – Inserting NOP

Page 18: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

C# Compiler – Inserting NOP

Debug Release

Page 19: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

C# Compiler – Branching

Page 20: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

C# Compiler – Branching

Debug Release

Page 21: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Compile time optimizationsDemo

Page 22: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Just In Time Compilation• Transformation of MSIL to native x86 / x64 / ARM

etc• Can optimize code

Mathematically ensured correctness

• Takes a small performance hit during startup

Compiler switch C# IL Code Quality JIT Native Code Quality

/optimize- /debug- Unoptimized Optimized

/optimize- /debug+ Unoptimized Unoptimized

/optimize+ /debug+ Optimized Optimized

Page 23: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

NGEN.exe

• JIT Compilation incurs a runtime cost

• NGEN pre-compiles MSIL assemblies to machine code

• Runs as a service in the background

• Also used by the “.NET Runtime Optimization Service”

Page 24: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

JIT - Local variable eliminationUser user = GetUser(3);PrintUser(user);

PrintUser(GetUser(3));

Before

After

Page 25: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

JIT – Range check eliminationstatic int[] _array = new int[10]; static volatile int _i; static void Main(string[] args) {

for (int i = 0; i < _array.Length; ++i) _i += _array[i];

}

static int[] _array = new int[10]; static volatile int _i; static void Main(string[] args) {

int[] localRef = _array; for (int i = 0; i < localRef.Length; ++i)

_i += localRef[i]; }

Before

After

Page 26: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

JIT – Method Inliningpublic class Program {

public static int And(int first, int second) { return first & second;

}static void Main(string[] args) {

int i = And(5, 4); }

}

public class Program { static void Main(string[] args) {

int i = 5 & 4; }

}

Before

After

Page 27: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

JIT – Tail Call Optimization

static void Main(string[] args){ TestTailCallOptimization();}

public static void TestTailCallOptimization(){ string s = "Test"; TailCall1(s);}

static void TailCall1(string s){ Console.WriteLine(s); TailCall2(s);}

static void TailCall2(string s){ Console.WriteLine(s + s);}

Page 28: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Native NGEN images are hard to debugRemove the NGEN image

Or, prevent NGEN image from loading

Loading non-precompiled assemblies

C:\> SET COMPLUS_ZAPDISABLE=1

C:\> NGEN uninstall MyAssembly

Page 29: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Preventing JIT optimization• Creating debug builds

JIT prevented through compile time attributes

• INI file MyAssembly.ini

• In Visual Studio, on module load after attach

[.NET Framework Debugging Control]GenerateTrackingInfo=1AllowOptimize=0

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]

Page 30: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Debugging optimized codeDemo

Page 31: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Debugging code• PDB files are as essential as code!

• Breakpoints can do way more than break

• Tracing is cheaper than debugging

• IntelliTrace can run in production

Page 32: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

PDB Files• Contain vital debugging information

No PDB? Severely limited debugging experience! Minimal investment: Symbol server

• Managed PDB files contain Source file names / line numbers Local variable names Alternate streams Used by TFS

Page 33: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Symbol Servers• Central repository for storing debug symbols• File system based technology• Integrated into Team Foundation and Visual

Studio

Page 34: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Locating debug symbols

• PDB files are located Same directory as module Hardcoded path in module Symbol server cache Symbol server

MyAssembly.dll MyAssembly.pdb

GUID GUIDEqual

Page 35: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Dumpbin.exe• Use to peek inside PE files

Page 36: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Prevent loading all PDBs

Page 37: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Visual Studio Source Server support• Allows Visual Studio to download relevant source

files automatically from a repository.

Page 38: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Configuring Symbol Locations

Page 39: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

PDB alternate streams• Used by TFS to store server path to sources

Page 40: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

SYMBOL SERVERS, SOURCE SERVERS AND SOURCE INDEXING

Demo

Page 41: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Working with break points

Page 42: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Setting breakpoints on automatic properties• Use ‘Break at function’ and enter get_name

Page 43: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Breakpoints on automatic properties• Inspect callstack / locals window

Page 44: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Debugging third party code• Red Gate .NET Reflector PRO

Decompile assemblies into source code Generate PDB file from assembly + source Enables debugging third party code

Page 45: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Enabling remote debugging• Run Remote Debugging x86 or x64• Give permissions• Connect

Page 46: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Debugging SharePointDemo

Page 47: SharePoint Saturday Belgium 2014 - Production debugging of SharePoint applications

Thank you!