Avatar billede angelenglen Nybegynder
02. november 2011 - 09:44 Der er 24 kommentarer og
1 løsning

VB.Net slå JIT debugger fra (Just-in-time)

Jeg har en app skrevet i VB.Net, og det hænder at den åbner en .Net JIT fejl-dialog.

Er det muligt at slå JIT fra?
Jeg vil meget hellere have at programmet bare crasher og lukker, end at den fejlbesked vises.

Kan det mon evt. lade sig gøre at få programmet til at logge til windows' event log i stedet for?

Eller tilføje fejl-beskeden til en tekstfil?
Avatar billede jokkejensen Novice
02. november 2011 - 11:23 #1
Er det ikke netop fordi du har VS.net installeret på din pc ? Tror ikke der vil komme en JIT debugger frem hvis man ikke har.
Avatar billede angelenglen Nybegynder
02. november 2011 - 11:50 #2
Nej, det kommer også på pc'er der ikke har VS.Net installeret.

Pc'erne har dog SQL Server 2008 Express installeret, ved ikke om det påvirker noget - det er det eneste der er installeret på pc'erne...

Uanset, så har jeg brug for at den ikke kommer frem.
Avatar billede angelenglen Nybegynder
02. november 2011 - 11:51 #3
Pc'erne kører forresten en 32-bit Windows 7 Home Premium.
Avatar billede jokkejensen Novice
02. november 2011 - 12:21 #4
http://msdn.microsoft.com/en-us/library/5hs4b7a6.aspx

under enable/disable, hjælper det ?
Avatar billede jokkejensen Novice
02. november 2011 - 12:22 #5
ex:

<configuration>
    <system.windows.forms jitDebugging="false" />
</configuration>
Avatar billede angelenglen Nybegynder
02. november 2011 - 12:35 #6
Jeg har prøvet at indsætte den kode i min app.config, men så får jeg bare en "ConfigurationErrorsException was unhandled" når jeg forsøger at starte programmet i Visual Studio :-(

min app.config ser sådan ud, det er kun linjen med jitDebugging jeg har tilføjet manuelt, resten var der i forvejen.



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.windows.forms jitDebugging="false" />
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="AppName_Main.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup>
        <supportedRuntime version="v2.0.50727" />
    </startup>
    <userSettings>
        <AppName_Main.My.MySettings>
            <setting name="setting1" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="setting2" serializeAs="String">
                <value />
            </setting>
            <setting name="setting3" serializeAs="String">
                <value />
            </setting>
            <setting name="setting4" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="setting5" serializeAs="String">
                <value>False</value>
            </setting>
            <setting name="setting6" serializeAs="String">
                <value></value>
            </setting>
        </AppName_Main.My.MySettings>
    </userSettings>
</configuration>
Avatar billede angelenglen Nybegynder
02. november 2011 - 12:36 #7
Jeg har forresten også forsøgt de foreslåede ændringer i registreringsdatabasen uden held :-/
Avatar billede angelenglen Nybegynder
02. november 2011 - 12:57 #8
hmm den holdt op med at kaste ConfigurationErrorsExceptions da jeg flyttede jitDebugging linjen ned så den var næst-sidste linje, altså lige over "</configuration>"

- jitDebuggeren kommer dog fortsat frem ved fejl :-/
Avatar billede jokkejensen Novice
02. november 2011 - 13:20 #9
og du husker at afvikle den med administrator rettigheder, JIT disable/enable skriver til reginfo, så app skal afvikles som admin ?

er det .net 3.0 ?

/J
Avatar billede angelenglen Nybegynder
02. november 2011 - 14:41 #10
Det er .net 2.0 og det kører med administrative rettigheder.

Ved en kombination af at rette en reg-nøgle, ændre visual studio indstillinger og ændre i machine.config har jeg fået den til at vise en anden dialog ved fejl.

Det virkede dog først da jeg enablede jit i machine.config og i projektet (under tools -> debugging -> just-in-time), så jeg tror jeg har misforstået den oprindelige dialog.
Som jeg forstår det NU, var just faktisk slået fra før, og den boks der blev vist var den .net viser ved fejl når jit ikke er aktiveret.

Den boks jeg oprindeligt fik vist var af samme type som denne:
http://i48.tinypic.com/a9s1vk.png

Nu fik jeg den til at vise en af følgende:
http://stackoverflow.com/questions/2334005/visual-studio-registry-capture-utility-has-stopped-working-error-compiling-c-sh


den "nye" jeg fik frem, bruger så vidt jeg forstår følgende fil:
c:\Windows\System32\vsjitdebugger.exe

Jeg har omdøbe at slette den fil, men så bliver den da først sur!


I bund og grund har jeg ikke løst problemet, jeg har bare ændret opførslen.



Det jeg ønsker er at programmet bare afslutter, uden at vente på at brugeren gør noget som helst.
Avatar billede jokkejensen Novice
02. november 2011 - 15:44 #11
altså var det ikke bedre at håndtere den fejl ?

vh
Avatar billede angelenglen Nybegynder
02. november 2011 - 15:48 #12
jo selvfølgelig.

Jeg har også håndteret alle de fejl jeg har fundet - problemet er hvis der er noget jeg ikke har opdaget, der først sker om en uge - så har jeg problemet igen.

Lige nu har jeg lavet en bevidst fejl, som jeg bruger til at teste, for at kunne se hvordan programmet opfører sig ved en uhåndteret fejl.

- Men mig bekendt findes der ingen programmer der er 100 % fejlfri, og hvor der er tænkt på alt hvad der nogensinde sker, kan ske eller ikke sker.
Avatar billede arne_v Ekspert
03. november 2011 - 02:47 #13
Kan du ikke catche Exception i Main?
Avatar billede angelenglen Nybegynder
03. november 2011 - 08:37 #14
Mener du form_load ?
I så fald har jeg prøvet, det hjalp ikke, fordi fejlen opstod et andet sted end i selve form_load sub'en.

(eksempelvis i en timer placeret på main formen)
Avatar billede arne_v Ekspert
03. november 2011 - 13:57 #15
Nej - jeg mener i Main!
Avatar billede angelenglen Nybegynder
03. november 2011 - 14:10 #16
Jeg har ikke nogen Main i programmet?

Kan jeg tilføje en Main efterfølgende?
Avatar billede arne_v Ekspert
03. november 2011 - 14:25 #17
Selvfoelgelig har du en Main - du skal bare finde den.

Er der en Program.cs i dit projekt?
Avatar billede angelenglen Nybegynder
03. november 2011 - 14:27 #18
Det er et vb.net projekt, ikke C#, så en program.cs har jeg ikke :-(
Avatar billede arne_v Ekspert
03. november 2011 - 14:33 #19
program.vb saa
Avatar billede angelenglen Nybegynder
03. november 2011 - 14:42 #20
Den har jeg heller ikke :-(

Projektet er startet som et almindeligt Windows Forms projekt.
Jeg har søgt efter " main", "main(" og "main (" i alle filer i projekt-mappen, og har ikke fundet noget match.

(at søge efter blot "main" giver ret mange hits, da min hoved-form hedder frmMain...)
Avatar billede arne_v Ekspert
03. november 2011 - 14:54 #21
Den skal vaere der.

Men ellers kan du jo bruge en teknik som:

http://www.thescarms.com/dotnet/unhandled.aspx
Avatar billede angelenglen Nybegynder
03. november 2011 - 15:20 #22
i filen "Application.Designer.vb" fandt jeg følgende:

    Partial Friend Class MyApplication
       
        <Global.System.Diagnostics.DebuggerStepThroughAttribute()>  _
        Public Sub New()
            MyBase.New(Global.Microsoft.VisualBasic.ApplicationServices.AuthenticationMode.Windows)
            Me.IsSingleInstance = true
            Me.EnableVisualStyles = true
            Me.SaveMySettingsOnExit = false
            Me.ShutDownStyle = Global.Microsoft.VisualBasic.ApplicationServices.ShutdownMode.AfterMainFormCloses
        End Sub
       
        <Global.System.Diagnostics.DebuggerStepThroughAttribute()>  _
        Protected Overrides Sub OnCreateMainForm()
            Me.MainForm = Global.Infologik_Main.frmMain
        End Sub
    End Class


Men hvis jeg smider indholdet af Sub New() i en try-catch, bliver den sur, og siger at MyBase.New(...) skal være den første linje :-/



Den side du linkede til har jeg også forsøgt mig med, men har på fornemmelsen at jeg ikke bruger det rigtigt.


i min frmMain class har jeg øverst lagt følgende to sub's :
  Private Sub MYExnHandler(ByVal sender As Object, _
      ByVal e As UnhandledExceptionEventArgs)
        Dim EX As Exception
        EX = e.ExceptionObject
        Console.WriteLine(EX.StackTrace)
  End Sub

  Private Sub MYThreadHandler(ByVal sender As Object, _
    ByVal e As Threading.ThreadExceptionEventArgs)
      Console.WriteLine(e.Exception.StackTrace)
  End Sub



I min frmMain_Load har jeg lagt følgende linjer:

  ' Get the your application's application domain.
  Dim currentDomain As AppDomain = AppDomain.CurrentDomain

  ' Define a handler for unhandled exceptions.
  AddHandler currentDomain.UnhandledException, AddressOf MYExHandler

  ' Define a handler for unhandled exceptions for threads behind forms.
  AddHandler Application.ThreadException, AddressOf MYThreadHandler



- for hvis jeg placerer ovenstående linjer i selve class-delen, uden for frmMain_load sub'en, får jeg "syntax error" ved AddHandler linjerne.

Visual Studio melder ingen fejl ved ovenstående, men hvis jeg ligesom i eksemplet dividerer med 0, bliver det ikke fandet af handleren som det var meningen.
Jeg dividerer med 0 i en timer, men ifølge sidens tekst, burde jeg kunne gøre det overalt i programmet, men det kan jeg åbenbart ikke :-/
Avatar billede arne_v Ekspert
06. november 2011 - 00:51 #23
foelgende virker hos mig:

Public Partial Class MainForm
        Public Sub New()
            InitializeComponent()
            AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf Sorry
        End Sub
        Private Sub Sorry(sender As Object, e As UnhandledExceptionEventArgs)
            MessageBox.Show("Sorry - we have a problem - we will close app now")
            Application.Exit()
            Environment.Exit(1)
        End Sub
        Private Sub Button1Click(sender As Object, e As EventArgs)
            Dim a As Integer = 0
            Dim b As Integer = 0
            Dim c As Integer = a \ b
        End Sub
End Class
Avatar billede angelenglen Nybegynder
08. november 2011 - 14:38 #24
Beklager jeg først vender tilbage nu, der kom lige noget sygdom i vejen :-/

Det virkede præcis som jeg havde håbet på, det er helt perfekt!
(Jeg har dog ændret lidt, så det prøver at logge detaljer om fejlen til en fil, før programmet afsluttes, men som løsning på mit spørgsmål er det perfekt!)


    Private Sub Sorry(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
        Try
            Dim EX As Exception
            EX = e.ExceptionObject
            Logger.LogInfo("Caught unhandled exception: " & EX.Message & vbCrLf & EX.StackTrace)
        Catch ex As Exception
            'do nothing...
        End Try
        Application.Exit()
        Environment.Exit(1)
    End Sub


Du må meget gerne lægge et svar, så jeg kan lukke spørgsmålet :-)
Avatar billede arne_v Ekspert
08. november 2011 - 14:43 #25
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester