|
4 / 4 / 0
Регистрация: 23.03.2010
Сообщений: 16
|
|||||||||||||||||||||
Std::string портит память24.03.2010, 00:52. Показов 2791. Ответов 8
Метки нет (Все метки)
Столкнулся с интересной проблемой. Лет 6 назад использовал одну прогу под ASPLinux 7.2. Исходники компилировались нормально и прога работала (gcc был, по-моему, версии 2.95).
Сейчас появился интерес реанимировать этот проект, но уже под Russian Fedora 12. Компиляция и установка прошли нормально, но при запуске программа выдала «Segmentation fault». Исследование проблемы показало, что сбой происходит на , казалось бы, абсолютно нормальном участке кода:
Поиски корней проблемы привели к следующему. Оказывается, содержимое Filters портится при выполнении следующей команды:
При выполнении этой строчки происходит пристыковка "/lib" + DBType + "db.so" к dblib_paths непосредственно в месте ее расположения и потом присвоение адреса этой области памяти переменной libfile. Причем пристыковка залезает на область памяти, занимаемой Filters, что впоследствии и приводит к сбою программы. После выполнения этой строчки libfile располагается там же, где был dblib_paths[0]. Хотя, по логике, при присвоении переменной класса string должно происходить копирование объекта. Т.е. менеджер памяти должен отслеживать ситуацию. Моделирование данной ситуации на простой программе показало, что действительно, менеджер памяти отслеживает эту ситуацию и при выполнении такой же строчки происходит копирование содержимого [I]dblib_paths в свободную область памяти и там уже происходит пристыковка всего остального. И libfile имеет уже другой адрес, чем [I]dblib_paths. Вопрос: почему так происходит? Почему раньше (на ASPLinux 7.2) эта прога работала, а теперь, в более новой версии Linux'а — такие косяки? Что-то с реализацией класса string? Или ключи какие надо установить? P.S. Предвидя вопросы типа где makefile, версия gcc и т.п. скажу, что прога эта - поисковая машина aspseek (www.aspseek.org), там все исходники.
0
|
|||||||||||||||||||||
| 24.03.2010, 00:52 | |
|
Ответы с готовыми решениями:
8
ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri Std::vector<std::pair<std::vector<int>::iterator, std::vector<int>::iterator>
|
|
4 / 4 / 0
Регистрация: 23.03.2010
Сообщений: 16
|
||
| 25.03.2010, 12:26 [ТС] | ||
|
Сделал strace -v -olog.txt ./index.
Ничего не прояснилось. Не знаю, нужно ли выкладывать весь файл, но вот самые IMHO интересные места: интересные места
execve("./index", ["./index"], ["ORBIT_SOCKETDIR=/tmp/orbit-aspseek", "HOSTNAME=zhost.localdomain", "IMSETTINGS_INTEGRATE_DESKTOP=yes", "SHELL=/bin/bash", "TERM=xterm", "HISTSIZE=1000", "XDG_SESSION_COOKIE=a9bff6c27c55ac971365 62054b916719-1269429242.1"..., "GTK_RC_FILES=/etc/gtk/gtkrc:/home/aspseek/.gtkrc-1.2-gnome2", "WINDOWID=69206019", "QTDIR=/usr/lib/qt-3.3", "QTINC=/usr/lib/qt-3.3/include", "IMSETTINGS_MODULE=none", "USER=aspseek", "LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00: pi=40;33:so=01;35:do=01;3"..., "SSH_AUTH_SOCK=/tmp/keyring-XWkPyc/socket.ssh", "GNOME_KEYRING_SOCKET=/tmp/keyring-XWkPyc/socket", "USERNAME=aspseek", "SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1745,unix/unix:/tmp/."..., "MC_TMPDIR=/tmp/mc-aspseek", "PATH=/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/u"..., "MAIL=/var/spool/mail/aspseek", "DESKTOP_SESSION=gnome", "QT_IM_MODULE=xim", "PWD=/home/aspseek/work/aspseek-1.2.15/src", "XMODIFIERS=@im=none", "GDM_KEYBOARD_LAYOUT=us", "GNOME_KEYRING_PID=1738", "KDE_IS_PRELINKED=1", "LANG=ru_RU.UTF-8", "GDM_LANG=ru_RU.UTF-8", "KDEDIRS=/usr", "GDMSESSION=gnome", "HISTCONTROL=ignorespace", "SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass", "SHLVL=3", "HOME=/home/aspseek", "GNOME_DESKTOP_SESSION_ID=this-is-deprecated", "MC_SID=2189", "LOGNAME=aspseek", "CVS_RSH=ssh", "QTLIB=/usr/lib/qt-3.3/lib", "DBUS_SESSION_BUS_ADDRESS=unix:abstr act=/tmp/dbus-oLoc3xq7DO,guid"..., "LESSOPEN=|/usr/bin/lesspipe.sh %s", "DISPLAY=:0.0", "G_BROKEN_FILENAMES=1", "COLORTERM=gnome-terminal", "XAUTHORITY=/var/run/gdm/auth-for-aspseek-jVOUtJ/database", "OLDPWD=/home/aspseek/work/aspseek-1.2.15", "_=/usr/bin/strace"]) = 0
brk(0) = 0x937d000 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78e2000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat64(3, {st_dev=makedev(8, 1), st_ino=176639, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=240, st_size=119297, st_atime=2010/03/23-23:31:20, st_mtime=2010/03/23-23:31:08, st_ctime=2010/03/23-23:31:08}) = 0 mmap2(NULL, 119297, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb78c4000 close(3) = 0 open("/lib/libdl.so.2", O_RDONLY) = 3 ..... ..... open("/usr/lib/libstdc++.so.6", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0 \1\0\0\0 \366I\0004\0\0\0\260\32\16\0\0\0\0\0004\ 0 \0\10\0(\0!\0 \0\1\0\0\0\0\0\0\0\0\240E\0"..., 512) = 512 fstat64(3, {st_dev=makedev(8, 1), st_ino=163990, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=1808, st_size=925656, st_atime=2010/03/23-16:11:40, st_mtime=2010/01/27-22:07:18, st_ctime=2010/03/20-15:17:41}) = 0 mmap2(0x45a000, 953260, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x45a000 mmap2(0x537000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xdc) = 0x537000 mmap2(0x53d000, 23468, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x53d000 close(3) = 0 ........ ........ mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c2000 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78c1000 set_thread_area({entry_number:-1 -> 6, base_addr:0xb78c16d0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 mprotect(0xbfc000, 8192, PROT_READ) = 0 mprotect(0xc4f000, 4096, PROT_READ) = 0 mprotect(0x537000, 16384, PROT_READ) = 0 mprotect(0xc21000, 4096, PROT_READ) = 0 mprotect(0xc07000, 4096, PROT_READ) = 0 mprotect(0xa89000, 4096, PROT_READ) = 0 munmap(0xb78c4000, 119297) = 0 set_tid_address(0xb78c1738) = 2369 set_robust_list(0xb78c1740, 0xc) = 0 futex(0xbf80a2d0, FUTEX_WAKE_PRIVATE, 1) = 0 futex(0xbf80a2d0, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_RE ALTIME, 1, NULL, bf80a2e0) = -1 EAGAIN (Resource temporarily unavailable) rt_sigaction(SIGRTMIN, {0xc0f3e0, [], SA_SIGINFO}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {0xc0f870, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 getrlimit(RLIMIT_STACK, {rlim_cur=10240*1024, rlim_max=RLIM_INFINITY}) = 0 uname({sysname="Linux", nodename="zhost.localdomain", release="2.6.31.5-127.fc12.i686.PAE", version="#1 SMP Sat Nov 7 21:25:57 EST 2009", machine="i686"}) = 0 brk(0) = 0x937d000 brk(0x939e000) = 0x939e000 brk(0x93bf000) = 0x93bf000 brk(0x93e0000) = 0x93e0000 getuid32() = 501 rt_sigaction(SIGSEGV, {0x808d5be, [], SA_RESETHAND}, {SIG_DFL, [], 0}, 8) = 0 fstat64(1, {st_dev=makedev(0, 10), st_ino=4, st_mode=S_IFCHR|0620, st_nlink=1, st_uid=501, st_gid=5, st_blksize=1024, st_blocks=0, st_rdev=makedev(136, 1), st_atime=2010/03/24-14:41:24, st_mtime=2010/03/24-14:41:24, st_ctime=2010/03/24-14:16:13}) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78e1000 Здесь я вывожу свойства Filters, который потом портится write(1, "1.Filters: empty=1 capacity=0 size=0 max_size=1073741823\n", 48) = 48 write(1, "2.Filters: empty=1 capacity=0 size=0 max_size=1073741823\n", 48) = 48 Вот здесь эта строчка : string libfile = dblib_paths[i] + "/lib" + DBType + "db-" VERSION ".so"; write(1, "3.Filters: empty=0 capacity=-191917709 size=29360180 max_size=1073741823\n", 64) = 64 ВСЁ! Filters испортился! write(1, " ---> /usr/local/aspseek/lib/libmysqldb-1.2.15.so\n", 50) = 50 <---- вывод содержимого libfile write(1, "libfile: empty=0 capacity=1073741824 size=43 max_size=1073741820\n", 63) = 63 write(1, "4.Filters:empty=0 capacity=-191917709 size=29360180 max_size=107374182"..., 66) = 66 futex(0xc08068, FUTEX_WAKE_PRIVATE, 2147483647) = 0 open("/usr/local/aspseek/lib/libmysqldb-1.2.15.so", O_RDONLY) = 3 ......... А вот здесь уже происходит обращение Filters.push_baсk(f); Как видно его свойства больше не меняются write(1, "Filters:empty=0 capacity=-191917709 size=29360180 max_size=1073741823\n", 62) = 62 --- SIGSEGV (Segmentation fault) @ 0 (0) --- write(2, "Address of param: bf802e70\n", 27) = 27 sigreturn() = ? (mask now []) --- SIGSEGV (Segmentation fault) @ 0 (0) --- +++ killed by SIGSEGV (core dumped) +++ Добавлено через 8 минут Но я думаю, что причина все-таки в чем-то другом - ведь на модельном примере все отрабатывается нормально. Добавлено через 21 час 8 минут Ошибка найдена!!! ![]() Как и ожидалось, именно в программе, а не в string ![]() Причина - в грубом вмешательстве в работу класса string через изменение статического члена класса через дальний указатель. Видимо, это работало под ранними версиями Linux, а впоследствии, может быть, программная реализация класса слегка изменилась. Всем спасибо за советы!!!
1
|
||
|
4 / 4 / 0
Регистрация: 23.03.2010
Сообщений: 16
|
||||||
| 25.03.2010, 17:33 [ТС] | ||||||
|
Вот пара строчек из текста программы, приводящая к ошибке, с комментариями автора.
Только мне не совсем понятно, зачем сделано именно так. И в чем особенность работы класса string (или классов со статическими членами?) на SMP system? Но это уже другой вопрос. Может, правда, кто-нибудь из спецов разъяснит для общего образования.
2
|
||||||
|
|
|
| 25.03.2010, 17:59 | |
|
Автор таким кодом, конечно же, жжот не по детски. С чем могут быть проблемы на SMP - фантазии как-то не хватает, чтобы понять. Правда я исхожу из того, что SMP - это многопроцессорная система. Хз, может есть другая аббревиатура
0
|
|
|
4 / 4 / 0
Регистрация: 23.03.2010
Сообщений: 16
|
||
| 25.03.2010, 22:35 [ТС] | ||
![]() Не надо линчевать автора! Автор - уважаемый человек! Программа хорошая и ведь работала раньше... Но пожурить надо, согласен
0
|
||
|
|
||
| 25.03.2010, 23:17 | ||
|
0
|
||
| 25.03.2010, 23:17 | |
|
Помогаю со студенческими работами здесь
9
Не освобождается память std::string после использования std::bind Запрошено преобразование от ‘const std::string*’ к нескалярному типу ‘std::string’ Перевод строк std::string, std::wstring в Unicode (String) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|