Відображення номера рядків у стежці стеку для складання .NET у режимі випуску


139

Чи є спосіб відобразити рядки в сліді стека для складання / розгортання збірки .NET в режимі випуску?

ОНОВЛЕННЯ:

Моя програма поділена на три бібліотечні проекти класу та один проект ASP.NET "веб-сайт". Помилка, яку я намагаюся виявити, є в одному з трьох бібліотечних проектів класу. Я розгорнув файл pdb лише для проекту бібліотеки класів, який генерує помилку "Посилання на об'єкт не встановлено на екземпляр об'єкта".

Номери рядків все ще не відображаються у сліді стека. Чи потрібно мені розгортати файли pdb для всіх проектів, щоб отримати номери рядків у сліді стека?

Робоче рішення

Розгортання pdb-файлу для кожної програми вирішило випуск номера рядка.

Відповіді:


147
  • Перейдіть у вікно Властивості для проекту, де ви хочете побачити номери рядків сліду стека.
  • Клацніть на збірці "вертикальна вкладка".
  • Виберіть конфігурацію "Відпустити". Перевірте постійний параметр DEBUG.
  • Зніміть прапорець "Оптимізувати код", щоб уникнути випадкової проблеми сліду з вбудованим кодом (цей крок не є важливим).
  • Натисніть кнопку Advanced ... і виберіть Output -> Inbug Info -> pdb only.
  • Розгорніть згенерований файл .pdb разом із збіркою.

Реалізовано з коментарем нижче:

  • Ще одне, що потрібно перевірити, - у розділі "Пакет / публікація в Інтернеті", що прапорець "Виключити створені символи налагодження" також не знімається

2
Чи потрібно розгорнути файл pdb разом із збіркою?
Майкл Кіскерн

7
Так. Тут знаходяться символи налагодження та номери рядків.
Джон Сондерс

5
Напевно, ви не хочете розкривати цю інформацію, якщо цього не потрібно. Використовуйте його для налагодження проблеми з клієнтами, так. Але ви не завжди хочете це робити, оскільки інформація про налагодження може видавати конфіденційні дані та бути вектором атаки. Залежно від вашої програми.
i_am_jorf

6
@Carlo: Інформація про налагодження працює і з кодом випуску (оптимізованого), проте налагодження дещо обмежене ( stackoverflow.com/questions/113866 ). Однак столові дзвінки досить надійні навіть в оптимізованому коді, за винятком вбудованих функцій та випадкових ситуацій, коли виклик хвоста може бути відсутнім, оскільки послідовність виклику xxx / ret була замінена на jmp xxx.
Сума

12
Ще одне, що потрібно перевірити, - у розділі "Пакет / публікація веб-сторінок", що прапорець "Виключити генеровані символи налагодження" також не знімається
Gaz

17

У VS2012 потрібно зняти прапорець "Виключити створені символи налагодження" в розділі "Пакет / Публікація веб-сайтів" також у властивостях.


або якщо це настільний додаток, переконайтеся, що розгорнуто файл PDB
CAD блокується


9

У минулому я стикався з проблемами, коли я відчував необхідність розгортати файли PDB зі збіркою релізів, щоб відстежувати помилку. Причина, як ви сказали, полягала в тому, що виняток стався в дуже великому методі, і я не міг точно визначити, де це відбувається.

Це може бути вказівкою на те, що метод потрібно переробити на більш дрібні, більш детальні методи. Не один розмір відповідає всім відповідям, але такий підхід мені добре послужив у короткостроковій перспективі (я часто виявляв помилку під час рефакторингу) та в довгостроковій перспективі.

Просто думка.


Це. І як ви їдете, кидайте спробу лову в більш ескізні місця з більш дрібним зерном. І збільшуйте охорону на початку цих функцій, якщо потрібно зробити припущення.
Джерард ОНІЛ

Часто говорять і так правда, однак, є спадщина, є програмісти, які пишуть нові великі методи, а іноді великий метод насправді найкраще робити (розбиття це заплутано чи ЯГНІ). Крім того, навіть для 5-рядкового методу - ви звужуєте свій пошук в 5 разів - тому PDB - це необхідне зло у виробництві, якщо ви не
відчуєте


0

У VS 2008 Express я знайшов це у розділі Властивості проекту -> Зібрати -> Додаткові параметри компіляції.


1
Що ти знайшов? Ви можете опублікувати коментар, якщо не хочете опублікувати повну відповідь.
jumxozizi

-4

Це працює щоразу. Вам просто потрібно підстроїти повідомлення про відстеження стека. По-справжньому легко! Крім того, на vb.net вам потрібно зробити "Показати всі файли" та включити pdb.

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

C # версія:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.