Linux / C ++ Как отладить релиз приложения - PullRequest
9 голосов
/ 27 мая 2009

У меня есть многопоточное приложение linux c ++. Теперь он протестирован на производственных серверах и имеет segfault. Проблема в том, что я не могу воспроизвести эту ошибку на любом из моих тестовых серверов и не имею доступа к рабочим серверам. У меня нет дампов или какой-либо другой полезной информации. Только строка: segfault в 0000000046bf0fb8 рип 000000000048ac6b rsp 0000000046bf0fa0 ошибка 6

Я хотел бы спросить сообщество, могу ли я получить с такой строки некоторую информацию, которая поможет уменьшить область возможных мест, где я должен искать. Я не могу запустить отладочную сборку из-за ее медленной скорости. Что я могу добавить к релизу, который поможет мне отладить? Эта ошибка выглядит как многопоточная ошибка, и ее трудно воспроизвести. Но я не уверен, потому что приложение работает с большим количеством разных писем от MTA.

Платформа: Linux

Строка компилятора: g ++ -O3 -D_REENTRANT

Спасибо.

обн .: Спасибо за ваши ответы. Я могу включить отладочную информацию. Я хотел бы знать основные методы отладки сборок релиза. Например, у меня есть версия дампа и выпуска. Как я должен продолжать. Что я должен прочитать об этом? Не могли бы вы в нескольких словах объяснить, как вы отлаживаете свое приложение, если это возможно? Спасибо.

Ответы [ 5 ]

13 голосов
/ 27 мая 2009

Как уже упоминал Энди, оставляйте символы отладки во время сборки релизов.

Если из-за этого размер готового исполняемого файла становится неприемлемо большим, вы можете сделать копию окончательного исполняемого файла и запустить ее через strip, чтобы удалить символы отладки. Таким образом, у вас есть два исполняемых файла, которые идентичны, за исключением того, что у одного есть символы отладки, а у другого нет. Поместите один без символов на производственный сервер. Когда происходит сбой, выполняется отладка копии исполняемого файла, в котором все еще содержатся символы отладки.

5 голосов
/ 03 июня 2009

Вы можете использовать gdb, чтобы получить обратную трассировку вашей программы в том месте, где она имеет ошибки, даже если вы не создавали свое приложение с флагами отладки. Это, по крайней мере, даст вам представление о том, где происходит сбой в работе вашего приложения.

gdb <your_app_exe>
gdb> run
gdb> backtrace

или

gdb <your_app_exe>
gdb> core-file <generated_core_file>
5 голосов
/ 27 мая 2009

Я недавно читал руководства по GDB, и они рекомендуют оставлять символы отладки, например, в. g++ -g.

Поскольку у вас нет доступа к производственному серверу, возможно, есть некоторые базовые функции ведения журналов, которые выводят данные в текстовый файл. Вы должны быть в состоянии приблизительно сузить место возникновения ошибки, в зависимости от того, какие данные были выведены в ваш файл журнала.

3 голосов
/ 27 мая 2009

Вы можете (и должны) создавать исполняемые файлы релиза с отладочной информацией. Если вы не хотите распространять исполняемые файлы, содержащие отладочную информацию, вы можете отделить отладочную информацию и установить ее позже для отладки. Это то, что мы делаем в нашем приложении.

1 голос
/ 19 июля 2010

ну, я нашел другое решение, которое я использую очень часто, мы обычно получаем стек (который мы получили в этом случае).

У меня есть исполняемый файл, который мы развертываем на какой-то встроенной платформе. скажем, мой исполняемый файл - сервер. я использую addr2line -e ./server и я вставляю стопку, которую я получил от клиента. это даст вам подробную информацию о строке, где возникает проблема.

это может вам помочь.

Спасибо

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