Есть ли способ автоматически взломать отладчик при вызове функций моей библиотеки классов? - PullRequest
9 голосов
/ 12 апреля 2010

У меня есть библиотека управляемых классов (например, mylib.dll) и стороннее управляемое приложение (например, app.exe), которое использует mylib.dll. У меня есть код mylib.dll, но не app.exe. Поэтому в настоящее время я собираю mylib.dll, копирую его в каталог app.exe, запускаю app.exe и присоединяюсь к процессу. Таким образом, если я ставлю точки останова в коде mylib.dll, я вижу, что их ударили. Но есть ли способ автоматически взломать код mylib.dll всякий раз, когда какое-либо внешнее приложение вызывает один из его открытых методов? то есть. Только для точек входа в dll.

спасибо, Mishal

Ответы [ 4 ]

7 голосов
/ 12 апреля 2010

В Project -> Properties -> Debug -> Start Action вы должны указать опцию Запустить внешнюю программу и ввести путь к вашему app.exe. Это должно запустить app.exe с подключенным отладчиком.

См. Также Как: изменить действие запуска для отладки приложений

Обновление: Точки останова в Visual Studio связаны либо с определенным местоположением (то есть с определенной строкой кода в исходном файле), либо с именем функции. Поэтому у вас есть два варианта прерывания в любой момент, когда вызывается функция в вашей сборке: Либо ставьте точки останова во всех объявлениях функций, либо во всех именах функций ( Отладка -> Новая точка останова -> Разрыв по имени функции ). К сожалению, последний вариант требует полного имени функции и не допускает подстановочные знаки.

Другая альтернатива, которую вы могли бы рассмотреть, - поместить Debug.Assert(false) в начале всех функций вашей библиотеки.

Еще одним вариантом будет использование макроса Visual Studio. Макрос ниже перебирает ваш DOM кода и добавляет точку останова для всех открытых методов и свойств:

Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics
Imports System.Windows.Forms

Public Module Breakpoints

    Sub AddBreakpointsToAllFunctionsAndProperties()
        Try
            If DTE.ActiveSolutionProjects.Length <> 1 Then
                MsgBox("Select one project within the Solution Explorer, then re-run this macro.")
                Exit Sub
            End If

            AddBreakpointsToProject(DTE.ActiveSolutionProjects(0))
        Catch ex As System.Exception
            MessageBox.Show(ex.ToString)
        End Try
    End Sub

    Private Sub AddBreakpointsToProject(ByVal proj As Project)
        For i As Integer = 1 To proj.ProjectItems.Count
            If Not proj.ProjectItems.Item(i).FileCodeModel Is Nothing Then
                AddBreakpointsToProjectItems(proj.ProjectItems.Item(i).FileCodeModel.CodeElements)
            End If
        Next
    End Sub


    Private Sub AddBreakpointsToProjectItems(ByVal colCodeElements As CodeElements)
        Dim objCodeElement As EnvDTE.CodeElement

        If Not (colCodeElements Is Nothing) Then
            For Each objCodeElement In colCodeElements
                AddBreakpointsToProjectItem(objCodeElement)
            Next
        End If
    End Sub

    Private Sub AddBreakpointsToProjectItem(ByVal objCodeElement As CodeElement)

        Dim objCodeNamespace As EnvDTE.CodeNamespace
        Dim objCodeType As EnvDTE.CodeType
        Dim objCodeFunction As EnvDTE.CodeFunction
        Dim objCodeProperty As EnvDTE.CodeProperty

        Try
            'MessageBox.Show(objCodeElement.FullName & " (Kind: " & objCodeElement.Kind.ToString & ")")

            If objCodeElement.Kind = vsCMElement.vsCMElementFunction Then
                objCodeFunction = DirectCast(objCodeElement, EnvDTE.CodeFunction)
                If objCodeFunction.Access = vsCMAccess.vsCMAccessPublic Then
                    DTE.Debugger.Breakpoints.Add(objCodeElement.FullName)
                End If
            ElseIf objCodeElement.Kind = vsCMElement.vsCMElementProperty Then
                objCodeProperty = DirectCast(objCodeElement, EnvDTE.CodeProperty)
                DTE.Debugger.Breakpoints.Add(objCodeElement.FullName)
            End If
        Catch ex As System.Exception
            ' Ignore
        End Try

        If TypeOf objCodeElement Is EnvDTE.CodeNamespace Then
            objCodeNamespace = CType(objCodeElement, EnvDTE.CodeNamespace)
            AddBreakpointsToProjectItems(objCodeNamespace.Members)
        ElseIf TypeOf objCodeElement Is EnvDTE.CodeType Then
            objCodeType = CType(objCodeElement, EnvDTE.CodeType)
            AddBreakpointsToProjectItems(objCodeType.Members)
        ElseIf TypeOf objCodeElement Is EnvDTE.CodeFunction Then
            objCodeFunction = DirectCast(objCodeElement, EnvDTE.CodeFunction)
            AddBreakpointsToProjectItems(CType(objCodeElement, CodeFunction).Parameters)
        End If
    End Sub

End Module
6 голосов
/ 12 апреля 2010

Я не пробовал это в библиотеке классов, но это может сработать.

System.Diagnostics.Debugger.Break();
3 голосов
/ 12 апреля 2010

Я не думаю, что есть возможность автоматически взламывать ваш код всякий раз, когда он вызывается.

Точки останова действительны только внутри отладчика, поэтому вам придется каким-то образом запускать все приложения в отладчике.

Чего вы пытаетесь достичь этим?

Вы просто хотите знать, когда вызывается ваша библиотека? Если это так, просто добавьте запись в свои точки входа.

Если у вас есть конкретная проблема с конкретным приложением, следуйте советам, которые дает 0xA3.

1 голос
/ 12 апреля 2010

System.Diagnostics.Debugger.Launch (); также является опцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...