2013-11-21 3 views
0

Моя программа не удалась с попыткой segfault написать «1» в строку.Arglist отличается от адреса кадра

(gdb) info frame 
Stack level 0, frame at 0xb6b3c040: 
eip = 0xb7877cdf; saved eip 0xb7858eae 
called by frame at 0xb6b3cc50 
Arglist at 0x91a1649, args: 
Locals at 0x91a1649, Previous frame's sp is 0xb6b3c040 
Saved registers: 
    ebx at 0xb6b3c02c, ebp at 0xb6b3c038, esi at 0xb6b3c030, edi at 0xb6b3c034, eip at 0xb6b3c03c 
(gdb) bt 
#0 0xb7877cdf in ??() from /lib/i386-linux-gnu/libc.so.6 
#1 0xb7858eae in vfprintf() from /lib/i386-linux-gnu/libc.so.6 
#2 0xb787d91b in vsnprintf() from /lib/i386-linux-gnu/libc.so.6 
#3 0x08ea7d7e in __gnu_cxx::__to_xstring<std::string, char> (__convf=0x85a2a50 <[email protected]>, __n=16, __fmt=0x91a1649 "%u") at /usr/include/c++/4.7/ext/string_conversions.h:95 
#4 0x08ea6452 in std::to_string (__val=1) at /usr/include/c++/4.7/bits/basic_string.h:2871 
... 

Я заметил, что согласно gdb, Arglist не находится в стеке. Как это могло случиться? Насколько я знаю, в * nix есть одно соглашение о вызове: аргументы помещаются в стек, вызывающий очищает стек кадров. Я поднимался и опускался по задней линии, и везде, где архейдер находился в штабеле.

ответ

0

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

Вероятно, основная проблема выше, чем кадр 0 в любом случае.

+0

спасибо. Я создал свое приложение с gcc 4.6.3, и проблема исчезла. Я предполагаю, что приложение, скомпилированное с 4.7.3, не является бинарным, совместимым с libc, скомпилированным с 4.6.3. –

Смежные вопросы