Отладка сторонней библиотеки Linux
От: keeper-andrew  
Дата: 23.05.13 16:04
Оценка:
Сразу предупрежу, что на С/С++ не программировал уже много лет. А для Linux на C/C++ не программировал никогда. И очень нужна помощь в отладке одной библиотечки, а пофиксать я и сам смогу. К сожалению ее разработчики еще не шевелятся, а релиз наступает на пятки.

Исходные данные.

Linux: Ubuntu Linux hhost 3.2.0-43-generic #68-Ubuntu SMP Wed May 15 03:33:33 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
LIBC: 2.15
libNRJavaSerial.so: библиотечка, вот с ней у нас и проблемы. К счастью есть исходники.

Работает приложение с USB портами. Спустя час-два вылетает. Бактрейс следующий:

*** buffer overflow detected ***: /usr/bin/java terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x37)[0x7f3f5712d817]
/lib/x86_64-linux-gnu/libc.so.6(+0x109710)[0x7f3f5712c710]
/lib/x86_64-linux-gnu/libc.so.6(+0x10a7ce)[0x7f3f5712d7ce]
/opt/tomcat7/temp/libNRJavaSerial_keeper_0/libNRJavaSerial.so(initialise_event_info_struct+0x1ca)[0x7f3f44fcd8aa]
/opt/tomcat7/temp/libNRJavaSerial_keeper_0/libNRJavaSerial.so(Java_gnu_io_RXTXPort_eventLoop+0x5c)[0x7f3f44fcf30c]
[0x7f3f4d011f90]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:01 5125809 /usr/lib/java/jdk1.7.0_21/bin/java
00600000-00601000 rw-p 00000000 08:01 5125809 /usr/lib/java/jdk1.7.0_21/bin/java

ну и так далее.....

Очевидно что валится в методе initialise_event_info_struct из-за какого-то кривого указателя. Но какая при этом выполняется сишная операция мне понятно. gdb показал код ассемблерный:
(gdb) x/20i initialise_event_info_struct+0x1ca-10
0x5fc0 <initialise_event_info_struct+448>: stos %rax,%es:(%rdi)
0x5fc2 <initialise_event_info_struct+450>: movslq (%rbx),%rdi
0x5fc5 <initialise_event_info_struct+453>: callq 0x37b0 <__fdelt_chk@plt>
0x5fca <initialise_event_info_struct+458>: mov (%rbx),%ecx
0x5fcc <initialise_event_info_struct+460>: mov $0x1,%edx
0x5fd1 <initialise_event_info_struct+465>: movq $0x0,0x158(%rbx)
0x5fdc <initialise_event_info_struct+476>: movq $0x3e8,0x160(%rbx)
0x5fe7 <initialise_event_info_struct+487>: movl $0x1,0x30(%rbx)
0x5fee <initialise_event_info_struct+494>: shl %cl,%rdx
0x5ff1 <initialise_event_info_struct+497>: or %rdx,0xd8(%rbx,%rax,8)
0x5ff9 <initialise_event_info_struct+505>: mov $0x1,%eax
0x5ffe <initialise_event_info_struct+510>: add $0x8,%rsp
0x6002 <initialise_event_info_struct+514>: pop %rbx
0x6003 <initialise_event_info_struct+515>: pop %rbp
0x6004 <initialise_event_info_struct+516>: retq
0x6005 <initialise_event_info_struct+517>: nopl (%rax)
0x6008 <initialise_event_info_struct+520>: test %rdx,%rdx
0x600b <initialise_event_info_struct+523>: movb $0x0,(%rdi)
0x600e <initialise_event_info_struct+526>: jne 0x5eab <initialise_event_info_struct+171>
0x6014 <initialise_event_info_struct+532>: jmpq 0x5e87 <initialise_event_info_struct+135>

Жирным я выделил адрес который соответствует initialise_event_info_struct+0x1ca если я ничего не перепутал.

У меня есть исходник, у меня есть эта библиотечка и я собрал ее с максимальной отладочной инфой. Но gdb не показывает сишный код. У меня есть Eclipse и KDevelop. Помогите пожалуйста установить точный оператор на котором валится приложение. Может быть есть способ отладки чтобы сопоставить код и этот адрес?

P.S. Вы не ошиблись все это крутится через жаву, но чтобы не уводить тему в оффтоп я об этом тактично умолчал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.