Отладка с gdb
От: Wody  
Дата: 24.03.09 09:30
Оценка:
Из-за такой опечатки:
int n;
sscanf(s.c_str(), "node: %llu", &n);

(где int — 32 бита, а из-за %llu sscanf читает 64)
программа падала (ошибка сегментации) в разных местах, пока не заметил эту строку. Подскажите, как с помощью gdb можно найти подобные ошибки (когда по неосторожности меняешь данные своей области памяти).

И еще, подскажите пожалуйста безопасный и простой аналог sscanf чтобы не думать о длине типа с поддержкой 64-битных целых чисел?

Благодарю.
Re: Отладка с gdb
От: MaxGl Украина  
Дата: 24.03.09 09:44
Оценка:
Здравствуйте, Wody, Вы писали:

W>программа падала (ошибка сегментации) в разных местах, пока не заметил эту строку. Подскажите, как с помощью gdb можно найти подобные ошибки (когда по неосторожности меняешь данные своей области памяти).


W>Благодарю.

Я в таких ситуациях анализирую core dump.
Re: Отладка с gdb
От: savitar  
Дата: 24.03.09 09:44
Оценка:
Здравствуйте, Wody, Вы писали:

W>Из-за такой опечатки:

W>
W>int n;
W>sscanf(s.c_str(), "node: %llu", &n);
W>

W>(где int — 32 бита, а из-за %llu sscanf читает 64)
W>программа падала (ошибка сегментации) в разных местах, пока не заметил эту строку. Подскажите, как с помощью gdb можно найти подобные ошибки (когда по неосторожности меняешь данные своей области памяти).

W>И еще, подскажите пожалуйста безопасный и простой аналог sscanf чтобы не думать о длине типа с поддержкой 64-битных целых чисел?


W>Благодарю.


gcc при компиляции предупреждает о таких вещах.
Re: Отладка с gdb
От: Аноним  
Дата: 24.03.09 09:53
Оценка:
Здравствуйте, Wody, Вы писали:

W>Подскажите, как с помощью gdb можно найти подобные ошибки (когда по неосторожности меняешь данные своей области памяти).

гуглить по ключевому слову "профайлер", гдб тут не при чем.

W>И еще, подскажите пожалуйста безопасный и простой аналог sscanf чтобы не думать о длине типа с поддержкой 64-битных целых чисел?

std::stringstream, boost::lexical_cast...
Re[2]: Отладка с gdb
От: MaxGl Украина  
Дата: 24.03.09 10:10
Оценка:
Здравствуйте, Аноним, Вы писали:
W>>Подскажите, как с помощью gdb можно найти подобные ошибки (когда по неосторожности меняешь данные своей области памяти).
А>гуглить по ключевому слову "профайлер", гдб тут не при чем.
А можно с этого места поподробнее?
Как с помощью профайлера можно найти подобную ошибку?
Я был уверен, что профайлер используется для совсем других целей...
Re[2]: Отладка с gdb
От: Tujh Голландия  
Дата: 24.03.09 10:15
Оценка:
Здравствуйте, Аноним, Вы писали:
W>>Подскажите, как с помощью gdb можно найти подобные ошибки (когда по неосторожности меняешь данные своей области памяти).
А>гуглить по ключевому слову "профайлер", гдб тут не при чем.
В данном случае не профайлер нужен, а valgrind
Re[3]: Отладка с gdb
От: MaxGl Украина  
Дата: 24.03.09 10:25
Оценка:
Здравствуйте, Tujh, Вы писали:


T>В данном случае не профайлер нужен, а valgrind

ближе к делу, но gdb + coredump удобнее и быстрее, ИМХО.
Re[4]: Отладка с gdb
От: Tujh Голландия  
Дата: 24.03.09 10:56
Оценка:
Здравствуйте, MaxGl, Вы писали:
MG>ближе к делу, но gdb + coredump удобнее и быстрее, ИМХО.
Может ошибусь, но gdb + coredump помогут если программа "упала", а если она "выжила" и работает с UB, то валгринд предпочтительней.
В любом случае прогнать через обоих не повредит
Re[5]: Отладка с gdb
От: MaxGl Украина  
Дата: 24.03.09 12:58
Оценка:
Здравствуйте, Tujh, Вы писали:

T>Может ошибусь, но gdb + coredump помогут если программа "упала", а если она "выжила" и работает с UB, то валгринд предпочтительней.

W> программа падала (ошибка сегментации) в разных местах
Она и падает. Но вот это "в разных местах" наводит на мысль, что падает она немного позже sscanf(), т.е. какое-то время работает с UB.
T>В любом случае прогнать через обоих не повредит
Согласен
Re[3]: Отладка с gdb
От: kamre Россия  
Дата: 24.03.09 14:13
Оценка:
Здравствуйте, Tujh, Вы писали:

А>>гуглить по ключевому слову "профайлер", гдб тут не при чем.

T>В данном случае не профайлер нужен, а valgrind

А разве valgrind умеет следить за памятью на стеке и сможет отловить такой случай?
Re[4]: Отладка с gdb
От: J.J.OK  
Дата: 24.03.09 15:19
Оценка:
Здравствуйте, kamre, Вы писали:

K>Здравствуйте, Tujh, Вы писали:


А>>>гуглить по ключевому слову "профайлер", гдб тут не при чем.

T>>В данном случае не профайлер нужен, а valgrind

K>А разве valgrind умеет следить за памятью на стеке и сможет отловить такой случай?

Нет: http://en.wikipedia.org/wiki/Valgrind#Limitations
Но все равно инструмент оччень полезный
Чем безопаснеe — тем неудобнее ;-)
Re[6]: Отладка с gdb
От: Wody  
Дата: 24.03.09 21:06
Оценка:
Всем спасибо за ответы и ссылки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.