none
lokaler pfad zu der PDB-Datei in der class-library RRS feed

  • Allgemeine Diskussion

  • hallo zusammen,

    ich möchte logdateien erstellen und in die erstellte logdatei unter anderem die aktuelle zeilennummer im code schreiben. dies erreiche ich über den StackFrame. Nun an die zeilennummer im code kommt man nicht ohne die PDB-Datei dran. wenn ich das auch lokal auf meinem rechner mache, klappt das alles. aber nicht auf einem anderen rechner. dann hab ich die betroffene dll-datei mit dem Editor geöffnet und sehe da einen absoluten bzw. lokalen pfad zu der zugehörigen pdb-datei neben dem ganzen verschlüsselten inhalt und es wurde mir klar, dass es darum auch nur auf meinem rechner funktionieren kann. 

    nun weiss ich nicht wieso dieser pfad so in meiner dll drin steht, und wie ich das problem lösen könnte.

    würde mich über vorschläge und lösungnsansätze sehr freuen.

    danke im voraus

    a.v.




    Dienstag, 15. Mai 2012 14:10

Alle Antworten

  • Warum klappt das nicht? Bei mir klappt es sobald ich die PDB in selber Verzeichnis wie die EXE liegen habe...


    Jochen Kalmbach (MVP VC++)
    Dienstag, 15. Mai 2012 17:24
  • Bist Du sicher, dass Du die PDB Datei ausliefern willst. Das macht Reverseengineering einfach!

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Dienstag, 15. Mai 2012 18:10
    Moderator
  • Warum klappt das nicht? Bei mir klappt es sobald ich die PDB in selber Verzeichnis wie die EXE liegen habe...


    Jochen Kalmbach (MVP VC++)
    öffne bitte die entsprechende dll mit nem editor und schau nach ob du auch einen lokalen pfad zu deiner pdb als klartext darin findest
    Dienstag, 15. Mai 2012 21:01
  • Bist Du sicher, dass Du die PDB Datei ausliefern willst. Das macht Reverseengineering einfach!

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    wie sonst kann ich die zeilennummer der aktuellen stelle protokollieren?
    Dienstag, 15. Mai 2012 21:01
  • wie sonst kann ich die zeilennummer der aktuellen stelle protokollieren?

    Bei Anwendungen, die als Release kompiliert wurden und bei denen die .pdb nicht weitergegeben wird, gar nicht.

    Die .pdb Datei sollte im selben Verzeichnis wie die .dll bzw. .exe liegen, dann klappt das auch. Da brauchst Du keinen absoluten/relativen/... Pfad, das passiert ganz automatisch.

    Dass im Kompilat der Pfad zur .pdb auf deinem Rechner steht, ist normal. Das hat aber nichts damit zu tun. Leg einfach die passende .pdb ins selbe Verzeichnis und alles wird gut :)

    Beachte aber dennoch Martin's Hinweis zu Reverse Engineering. Allerdings klappt das auch ohne .pdb ganz gut, siehe Tools wie JustDecompile


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 15. Mai 2012 23:42
    Moderator
  • Was hat das damit zu tun???


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 16. Mai 2012 04:05
  • Mit C++ ;) Das wage ich zu bezweifeln...

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 16. Mai 2012 07:15
    Moderator
  • Vergiß das doch einfach und erzeuge einen Minidump. Da steht alles drin was Du brauchst... Zur Not schreibst Du noch ein paar andere Infos in eine Textdatei.

    Ansonsten kann man auch mit __FUNCTION__ im Code arbeiten. Dann brauchst Du auch keine Codezeile.

    Zu was sol das dienen? Allgemeines loggen, oder Fehlersuche und Crashdumps?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 16. Mai 2012 07:16
    Moderator
  • Hi Jungs,

    Jochen Kalmbach: Was hat das damit zu tun???
    Martin Richter: Mit C++ ;) Das wage ich zu bezweifeln...

    von was redet ihr eigentlich? So ganz ohne Zitat weiß doch keiner, auf was ihr euch bezieht. Sein(e) Posting(s), mein Posting, was ganz anderes, ...? :)

    Ist der OP bei euch in VC++ Gast, dass ihr davon ausgeht, dass er das mit C++ macht? (Das will ich eigentlich nur wissen, damit ich verstehe, auf was ihr euch bezieht^^)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 16. Mai 2012 07:37
    Moderator
  • öffne bitte die entsprechende dll mit nem editor und schau nach ob du auch einen lokalen pfad zu deiner pdb als klartext darin findest

    Was in der PDB-Datei steht, dient nur zur Info. Die PDB wird normal gefunden, wenn sie im gleichen Verzeichnis wie die EXE liegt; unabhängig welche Pfade in der PDB drin stehen...


    Jochen Kalmbach (MVP VC++)
    Mittwoch, 16. Mai 2012 08:15
  • Weil es um die direkte Auflösung des Stackframes geht. Das ist in der .NET Welt so einfach nihct möglich.

    Ich gehe also zu 95% davon aus, dass es um C++ undnativen Code geht.

    Sorry: Sicher hätte ich die Annahme dazuschreiben solllen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 16. Mai 2012 11:33
    Moderator
  • Weil es um die direkte Auflösung des Stackframes geht. Das ist in der .NET Welt so einfach nihct möglich.

    Also ich weiß jetzt nicht, was Du meinst. Aber wenn es das hier ist, geht das recht einfach:

    using System.Diagnostics;
    
    ...
    
    try {
        ...
    }
    catch( Exception ex ) {
        StackTrace st = new StackTrace( ex, true );
        StackFrame sf = st.GetFrame(0);
        int LineNumber = sf.GetFileLineNumber();
        ...
    }
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 16. Mai 2012 11:39
    Moderator
  • Das ganze geht in .NET auch ohne, dass man zuvor eine Exception erzeugen muss...

    namespace ConsoleApplicationVs2010
    {
        internal class Program
        {
            private static void Main(string[] args)
            {
                var s = new System.Diagnostics.StackTrace(true);
                foreach(var f in s.GetFrames())
                {
                    Console.WriteLine("{0}: {1}", f.GetFileName(),
    f.GetFileLineNumber());
                 }
            }
        }
    }

    Jochen Kalmbach (MVP VC++)
    Mittwoch, 16. Mai 2012 11:51
  • Vergiß das doch einfach und erzeuge einen Minidump. Da steht alles drin was Du brauchst... Zur Not schreibst Du noch ein paar andere Infos in eine Textdatei.

    Ansonsten kann man auch mit __FUNCTION__ im Code arbeiten. Dann brauchst Du auch keine Codezeile.

    Zu was sol das dienen? Allgemeines loggen, oder Fehlersuche und Crashdumps?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    das soll der fehlersuche dienen...

    ich werde mich jetzt damit beschäftigen wie ich einen minidump erzeugen kann und was mir so ein minidump alles liefern kann, und mir __FUNCTION__ unter die lupe nehmen. hab damit keinerlei erfahrungen gemacht bis heute...

    wenn du mir auf diesem weg etwas weiterhelfen würdest, wäre ich dir dankbar.

    p.s. ja ihr hattet recht, der pfad ist zwar in der dll drin, aber die dll bezieht sich auf die pdb die im eigenen verzeichnis lieg.



    Mittwoch, 16. Mai 2012 11:54
  • also die variante mit dem minidump kann ich vergessen da es nicht so einfach geht in c# und ausserdem brauch ich nur ein paar kleine infos die ich in eine textdatei schreiben möchte...

    __FUNCTION__ wird in c# nicht unterstützt. 

    der stackframe funktioniert ja auch nur mit der pdb zusammen... also anscheinend keine lösung!

    Mittwoch, 16. Mai 2012 12:16
  • Hi,

    falls Du bspw. die Methoden/Klassennamen ermitteln willst, siehe:

      http://www.aspnetzone.de/blogs/stefanfalz/archive/2008/02/23/net-methodennamen-per-reflection-ermitteln.aspx

    Dass bestimmte Sachen eben nicht gehen, weißt Du ja nun. StackTrace und Stackframe funktionieren auch ohne .pdb. Nur halt nicht so aussagekräftig.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 16. Mai 2012 13:08
    Moderator
  • Hi,

    falls Du bspw. die Methoden/Klassennamen ermitteln willst, siehe:

      http://www.aspnetzone.de/blogs/stefanfalz/archive/2008/02/23/net-methodennamen-per-reflection-ermitteln.aspx

    Dass bestimmte Sachen eben nicht gehen, weißt Du ja nun. StackTrace und Stackframe funktionieren auch ohne .pdb. Nur halt nicht so aussagekräftig.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    hi, danke für den hinweis. das hab ich bereits alles drin... das einzige was unlösbar scheint, ist die aktuelle zeilennummer

    Mittwoch, 16. Mai 2012 13:11
  • Hi,

    ist es auch, wenn Du die pdb nicht mitgibst. Aber wo ist da nun das Problem? Wenn Du die Zeilennummer zwingend brauchst, lass halt eine minimal ausgestattete PDB erzeugen und leg die im selben Verzeichnis wie die DLL bzw. EXE ab.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 16. Mai 2012 13:25
    Moderator
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************

    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 21. Mai 2012 10:32
    Moderator