c# python - Come posso includere i numeri di riga in una traccia stack senza un pdb?





idle plugin (5)


No non c'è. Tutte le informazioni necessarie per mappare le linee di IL al file sorgente originale e il numero di riga sono memorizzati nel PDB. Non è possibile ottenere queste informazioni nello stack trace senza il PDB.

Attualmente stiamo distribuendo un'app WinForms senza file .pdb per risparmiare spazio sui computer client e scaricare larghezza di banda. Quando riceviamo tracce di stack, stiamo ricevendo i nomi dei metodi ma non i numeri di riga. C'è un modo per ottenere i numeri di riga senza ricorrere alla distribuzione dei file .pdb?




Non è la risposta appropriata alla tua domanda, ma ho un suggerimento. È possibile incorporare un meccanismo di registrazione e ottenere questi file di registro accanto alle tracce dello stack. Se si includono numeri di riga nei messaggi di registro, è possibile combinare manualmente le informazioni di registrazione con la traccia dello stack.

Se non si desidera occupare molto spazio, è possibile utilizzare file di registro di dimensioni limitate, in questo modo verranno conservati solo i messaggi di registro più recenti.

Usiamo la libreria log4net per le nostre esigenze di registrazione, vi consiglio di dare un'occhiata.




Non è possibile ottenere una traccia stack con numeri di linea direttamente dall'applicazione, a meno che non si impacchetta il PDB. Tuttavia , se si dispone dei file PDB per la stessa versione dell'app che si inviano ai propri clienti, e non ci si preoccupa di alcuni script chiari, è possibile trasformare la traccia dello stack .NET e gli offset IL in numeri di linea.

Durante il processo di compilazione, utilizza il convertitore pdb2xml di Mike Stall , distribuito come parte del suo eccellente debugger di codice gestito da MDbg , e memorizzale in un luogo sicuro (ad esempio, il controllo del codice sorgente). Quando si ottiene una traccia di stack dal client, è possibile interrogare l'offset IL dai dati XML per determinare il numero di riga pertinente. Se le tracce dello stack vengono inviate a un sito Web, puoi perfino automatizzare la conversione, in modo che gli sviluppatori possano già ottenere tracce dello stack completamente dettagliate nel momento in cui i casi raggiungono la loro posta in arrivo.




No. I numeri di riga fanno parte delle informazioni di debug, che vengono memorizzate solo nel file PDB. Questo è il motivo per cui i file PDB esistono in primo luogo.




La prima parte della tua domanda (come ottenere i byte) ha già ricevuto risposta da altri: guarda nello spazio dei nomi System.Text.Encoding .

Tratterò la tua domanda di follow-up: perché hai bisogno di scegliere una codifica? Perché non puoi ottenerlo dalla stessa classe di stringhe?

La risposta è in due parti.

Prima di tutto, i byte usati internamente dalla classe string non hanno importanza , e ogni volta che si presume lo facciano probabilmente introducendo un bug.

Se il tuo programma è interamente all'interno del mondo .Net, allora non devi preoccuparti di ottenere array di byte per le stringhe, anche se stai inviando dati attraverso una rete. Invece, utilizzare la serializzazione .Net per preoccuparsi della trasmissione dei dati. Non ti preoccupare più dei byte effettivi: il formattatore di serializzazione lo fa per te.

D'altra parte, cosa succede se si inviano questi byte da qualche parte che non si può garantire l'estrazione dei dati da un flusso serializzato .Net? In questo caso hai sicuramente bisogno di preoccuparti della codifica, perché ovviamente questo sistema esterno si preoccupa. Quindi, di nuovo, i byte interni utilizzati dalla stringa non contano: è necessario scegliere una codifica in modo da poter essere espliciti su questa codifica sul lato ricevente, anche se è la stessa codifica utilizzata internamente da .Net.

Capisco che in questo caso potresti preferire utilizzare i byte effettivi memorizzati dalla variabile stringa nella memoria, ove possibile, con l'idea che potrebbe salvare del lavoro creando il flusso di byte. Tuttavia, l'ho messo per te non è importante rispetto al fare in modo che il tuo output sia compreso dall'altra parte, e per garantire che tu debba essere esplicito con la tua codifica. Inoltre, se vuoi davvero abbinare i tuoi byte interni, puoi già scegliere la codifica Unicode e ottenere così un risparmio di prestazioni.

Il che mi porta alla seconda parte ... la scelta della codifica Unicode sta dicendo a .Net di usare i byte sottostanti. È necessario scegliere questa codifica, perché quando esce Unicode-Plus un po 'nuovo, il runtime .Net deve essere libero di utilizzare questo modello di codifica più recente e migliore senza interrompere il programma. Ma, per il momento (e il futuro prevedibile), scegliere la codifica Unicode ti dà quello che vuoi.

È anche importante capire che la stringa deve essere riscritta sul filo, e ciò implica almeno una certa traduzione del pattern di bit anche quando si utilizza una codifica corrispondente . Il computer deve tenere conto di cose come Big vs Little Endian, ordine dei byte di rete, pacchetti, informazioni sulla sessione, ecc.







c# .net debugging deployment pdb-files