Skip to forum content

You are not logged in. Please login or register.


forums.pvpgn.pro → [RU] Research & Development → core dump. Сервер падает под freebsd 10

Pages 1

You must login or register to post a reply

RSS topic feed

Posts: 47

1 (edited by iltmpz 05.11.2014 18:25)

Topic: core dump. Сервер падает под freebsd 10

4-й день бьюсь со следующей проблемой:

Пустил новый pvpgn-1.9.9 со всеми последними коммитами на продакшен-сервере, подцепив к нему ресурсы старого.
Ресурсы - это база и почта, конфиги скопировал частью со старого 1.8.5, частью взяв от версии 1.9.9, подправив по необходимости.
Все работало отлично - логи писались, юзеры заходили, игры создавались. Минут 10. Потом хлоп - дисконнект. Смотрю - процесс bnetd упал. Просто упал, без всяких причин.
Юзеры понятно недовольны.

Сервак - freebsd 10, amd64, vps.
На момент падения юзеров было человек 10. Всего в базе BNET порядка 40000 юзеров.

До этого тестировал на той же базе с теми же настройками на freebsd 8.4 amd64 - полет нормальный на протяжение недель. Правда юзеров заходило меньше.

Дальнейшие перезапуски 1.9.9 дают тот же результат: сервер работает порядка 10 минут и падает.
1.8.5 при этом работает отлично.

Память не переполняется - 1.8.5 жрет порядка 25 Мб, 1.9.9 - 50 Мб.
Потом просто раз - и падает.
В bnetd.log в логах ничего вообще по проблеме не углядел, гоняю в режиме trace.

В message вот что:

# cat /var/log/messages | grep bnetd
Nov  3 20:27:34 11708 kernel: pid 17934 (bnetd), uid 700: exited on signal 11
Nov  3 20:43:32 11708 kernel: pid 18090 (bnetd), uid 700: exited on signal 11
Nov  3 21:02:51 11708 kernel: pid 903 (bnetd), uid 700: exited on signal 11
Nov  4 15:05:12 11708 kernel: pid 905 (bnetd), uid 700: exited on signal 10
Nov  4 15:21:51 11708 kernel: pid 893 (bnetd), uid 700: exited on signal 11
Nov  5 14:14:24 11708 kernel: pid 42634 (bnetd), uid 700: exited on signal 11

Т.е. тупо молча падает в 11 (seg fault), 1 раз упал в 10 (bus error).

Собирал со следующими параметрами:

cmake -D CMAKE_CXX_COMPILER=/usr/local/bin/c++47 -D CMAKE_INSTALL_PREFIX=/usr/local/pvpgn-1.9.9 -D WITH_MYSQL=true -D WITH_LUA=true -g -O0 ../

-g -O0 - это я уже сегодня приписал, когда изучал README.DEV, о том, как правильно коры делать.

c++47 - это потому что freebsd с 10-й версии на clang перешла по дефолту вместо gcc, который нифига pvpgn не может собрать. Поэтому собирал с помощью gcc47.
На тестовом сервере 8.4 было gcc42.

Сегодня пересобрал с -g -O0, как написано в README.DEV, пустил сервер в foreground-режиме.
Сервер опять поработал порядка 10 минут и сказал: "segmentation fault".

И вот тут подходим ко 2-му вопросу:
почему оно не генерирует core dump?

Я сначала думал, что дело в настройках сервера, проверил # sysctl -a | grep core

kern.sugid_coredump: 0
kern.capmode_coredump: 0
kern.coredump: 1
kern.nodump_coredump: 0
kern.corefile: %N.core
debug.elf64_legacy_coredump: 0
debug.elf32_legacy_coredump: 0
debug.ncores: 5

Потом добавил в /etc/rc.conf:

dumpdev="AUTO"
dumpdir="/var/crash"

Потом перезагрузился.
Это было позавчера.

Сегодня решил для 100% гарантии проверить - написал прогу, падающую в core:

main()
{
char *a;
a=NULL;
a[0]='1';
}

Компилирую: # /usr/local/bin/c++47 core.c
Запустил, получил Segmentation fault (core dumped). core создался.
Попробовал запустить от другого юзера (не рута) - core создался.
Вопрос: почему тогда в pvpgn core не создается?
Нагуглил, что вроде как можно внутри самой проги сделать то ли перехват генерации коры, то ли еще что-то, соответственно, вопрос к вам как к девелоперам - что мне со всем этом делать?
Как мне получить кору, а в идеале - внятную ошибку в логах или совсем в идеале - не падающий pvpgn?

2

Re: core dump. Сервер падает под freebsd 10

В UNIX системах дамп должен создаваться самой системой, без изменения кода в программе, как в Windows.
Возможно, все-таки PVPGN не скомпилировался в режиме debug, или запуск происходит в другой директории и core создается где-то в другом месте?

Как получить его на Linux, и извлечь оттуда stack trace, описано здесь.
Поскольку на FreeBSD уже получилось создать core на тестовой программе, то можно так же вставить плохой код при запуске PvPGN, чтобы сразу получить дамп, не ожидая падения сервера (src/bnetd/main.cpp функция main()).

Добавлено: 05.11.2014 15:50

Не создаваться может из-за ограничения ulimit, при котором дамп выходящий размером за его пределы не создается. По ссылке выше на гитхабе про это тоже написано.

Do not ask for support in PM.

3

Re: core dump. Сервер падает под freebsd 10

ulimit у меня unlimited...

Разобрался!
Не генерироваться может из-за различия UID и EUID, что у меня и имело место: www.sql.ru/forum/214023/zavershe … egv-i-core
#effective_user  = bnetd
#effective_group = bnetd

Закомментировал, запустил от рута, упало:
Segmentation fault (core dumped)

Ура, получил кору на 22 Мб.

Буду разбираться smile

4

Re: core dump. Сервер падает под freebsd 10

Отлично, ждем результат по падению сервера!

Do not ask for support in PM.

5

Re: core dump. Сервер падает под freebsd 10

Есть!
Раз:

# gdb ./bnetd ./bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/liblua-5.1.so...done.
Loaded symbols for /usr/local/lib/liblua-5.1.so
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /lib/libreadline.so.8...done.
Loaded symbols for /lib/libreadline.so.8
Reading symbols from /lib/libthr.so.3...done.
Loaded symbols for /lib/libthr.so.3
Reading symbols from /lib/libncurses.so.8...done.
Loaded symbols for /lib/libncurses.so.8
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x0000000800ecb150 in lua_yield () from /usr/local/lib/liblua-5.1.so
[New Thread 802c06400 (LWP 100074/bnetd)]
(gdb)

Два:

(gdb) bt full
#0  0x0000000800ecb150 in lua_yield () from /usr/local/lib/liblua-5.1.so
No symbol table info available.
#1  0x0000000800ecb3d0 in lua_yield () from /usr/local/lib/liblua-5.1.so
No symbol table info available.
#2  0x0000000800ecb2c8 in lua_yield () from /usr/local/lib/liblua-5.1.so
No symbol table info available.
#3  0x0000000800ec3eca in lua_pushlstring () from /usr/local/lib/liblua-5.1.so
No symbol table info available.
#4  0x00000000004d8242 in lua::stack::push (this=0x7fffffffd120, v=@0x80334d8d0) at gthr-default.h:218
No locals.
#5  0x00000000004d852b in lua::stack::push<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > (
    this=0x7fffffffd120, v=@0x7fffffffd040) at gthr-default.h:218
        i = {_M_node = 0x80334d8b0}
#6  0x00000000004dd976 in lua::bind::operator<< <std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > > (this=0x7fffffffd120, v=@0x7fffffffd040) at /root/pvpgn/il/pvpgn/src/bnetd/luainterface.cpp:93
No locals.
#7  0x00000000004dc1e2 in pvpgn::bnetd::lua_handle_channel (channel=0x802c1b350, c=0x803a1e500, message_text=0x0,
    message_type=pvpgn::bnetd::message_type_null, luaevent=pvpgn::bnetd::luaevent_channel_userjoin) at /root/pvpgn/il/pvpgn/src/bnetd/luainterface.cpp:93
        o_account = {_M_t = {
    _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<No data fields>}, <No data fields>}, _M_key_compare = {<std::binary_function<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>> = {<No data fields>}, <No data fields>}, _M_header = {_M_color = std::_S_red, _M_parent = 0x802fd0d00,
        _M_left = 0x80334d850, _M_right = 0x803079460}, _M_node_count = 14}}}
        o_channel = {_M_t = {
    _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<No data fields>}, <No data fields>}, _M_key_compare = {<std::binary_function<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>> = {<No data fields>}, <No data fields>}, _M_header = {_M_color = std::_S_red, _M_parent = 0x80334db50,
        _M_left = 0x80336e0d0, _M_right = 0x80334dc40}, _M_node_count = 12}}}
        result = 0
        account = (t_account *) 0x803081e80
        func_name = 0x5a1abf "handle_channel_userjoin"
        __FUNCTION__ = "lua_handle_channel"
#8  0x000000000042b37d in pvpgn::bnetd::channel_add_connection (channel=0x802c1b350, connection=0x803a1e500)
    at /root/pvpgn/il/pvpgn/src/bnetd/channel.cpp:83
        member = (t_channelmember *) 0x80336b760
        user = (t_connection *) 0x0
        __FUNCTION__ = "channel_add_connection"
#9  0x000000000045640c in pvpgn::bnetd::conn_set_channel (c=0x803a1e500, channelname=0x8039e8e18 "War2BNE")
    at /root/pvpgn/il/pvpgn/src/bnetd/connection.cpp:125
        ch_clan = (t_clan *) 0x801bbbd4c
        channel = (t_channel *) 0x802c1b350
        oldchannel = (t_channel *) 0x0
        acc = (t_account *) 0x803081e80
        curr = (t_elem *) 0x801bb8dd0
        clan = (t_clan *) 0x0
        member = (t_clanmember *) 0x0
        __FUNCTION__ = "conn_set_channel"
        clantag = 0
        created = 0
#10 0x0000000000475edd in _client_joinchannel (c=0x803a1e500, packet=0x8039e8e00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:340
        ostr = {<std::basic_ostream<char, std::char_traits<char> >> = {<std::basic_ios<char, std::char_traits<char> >> = {<std::ios_base> = {
        _vptr.ios_base = 0x600000010, static boolalpha = <optimized out>, static dec = <optimized out>, static fixed = <optimized out>,
---Type <return> to continue, or q <return> to quit---
        static hex = <optimized out>, static internal = <optimized out>, static left = <optimized out>, static oct = <optimized out>,
        static right = <optimized out>, static scientific = <optimized out>, static showbase = <optimized out>, static showpoint = <optimized out>,
        static showpos = <optimized out>, static skipws = <optimized out>, static unitbuf = <optimized out>, static uppercase = <optimized out>,
        static adjustfield = <optimized out>, static basefield = <optimized out>, static floatfield = <optimized out>, static badbit = <optimized out>,
        static eofbit = <optimized out>, static failbit = <optimized out>, static goodbit = <optimized out>, static app = <optimized out>,
        static ate = <optimized out>, static binary = <optimized out>, static in = <optimized out>, static out = <optimized out>,
        static trunc = 3850979413, static beg = <optimized out>, static cur = <optimized out>, static end = 100, _M_precision = 96733,
        _M_width = 4294967297, _M_flags = 4294956336, _M_exception = 32767, _M_streambuf_state = std::_S_goodbit, _M_callbacks = 0x0, _M_word_zero = {
          _M_pword = 0x0, _M_iword = 0}, _M_local_word = {{_M_pword = 0x0, _M_iword = 34390490608}, {_M_pword = 0x801d53df0, _M_iword = 0}, {
            _M_pword = 0x8048079c0, _M_iword = 131071}, {_M_pword = 0x0, _M_iword = 0}, {_M_pword = 0x600000010, _M_iword = 121028}, {
            _M_pword = 0x300038323000007b, _M_iword = 3472328296227877427}, {_M_pword = 0xb00373234, _M_iword = 4}, {_M_pword = 0xe00000003,
            _M_iword = 34419115451}}, _M_word_size = 27, _M_word = 0x8038946cc, _M_ios_locale = {static none = <optimized out>,
          static ctype = <optimized out>, static numeric = <optimized out>, static collate = <optimized out>, static time = -443987883,
          static monetary = <optimized out>, static messages = <optimized out>, static all = <optimized out>, _M_impl = 0x600000055,
          static _S_classic = <optimized out>, static _S_global = <optimized out>, static _S_categories = <optimized out>,
          static _S_once = <optimized out>}}, _M_tie = 0xe7d0, _M_fill = 17 '\021', _M_fill_init = false, _M_streambuf = 0x1300000064,
      _M_ctype = 0x1300000001, _M_num_put = 0x0, _M_num_get = 0x600000010}, _vptr.basic_ostream = 0x600000010},
  _M_stringbuf = {<std::basic_streambuf<char, std::char_traits<char> >> = {_vptr.basic_streambuf = 0x179dd,
      _M_in_beg = 0x100000001 <Address 0x100000001 out of bounds>, _M_in_cur = 0x7fffffffd530 "\004", _M_in_end = 0x0, _M_out_beg = 0x0, _M_out_cur = 0x0,
      _M_out_end = 0x0, _M_buf_locale = {static none = <optimized out>, static ctype = <optimized out>, static numeric = <optimized out>,
        static collate = <optimized out>, static time = -443987883, static monetary = <optimized out>, static messages = <optimized out>,
        static all = <optimized out>, _M_impl = 0x0, static _S_classic = <optimized out>, static _S_global = <optimized out>,
        static _S_categories = <optimized out>, static _S_once = <optimized out>}}, _M_mode = 30752240, _M_string = {static npos = <optimized out>,
      _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
        _M_p = 0x801d53df0 <Address 0x801d53df0 out of bounds>}}}}
        account = (t_account *) 0x803081e80
        clienttag = 1462911566
        channel = (t_channel *) 0x0
        __FUNCTION__ = "_client_joinchannel"
        tmpstr = {static npos = <optimized out>,
  _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x8013efbb8 ""}}
        cname = 0x8039e8e18 "War2BNE"
        found = 1
        user_clan = (t_clan *) 0x7fffffffd6e0
        clantag = 4294956752
#11 0x000000000046aa42 in handle (htable=0x566e00, type=3327, c=0x803a1e500, packet=0x8039e8e00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:344
        p = (const N5pvpgn5bnetd12t_htable_rowE *) 0x566fb0
        res = 0
#12 0x000000000046a8a7 in pvpgn::bnetd::handle_bnet_packet (c=0x803a1e500, packet=0x8039e8e00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:314
        __FUNCTION__ = "handle_bnet_packet"
#13 0x00000000004b9967 in sd_tcpinput (c=0x803a1e500) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        ret = 60726272
        packet = (t_packet *) 0x8039e8e00
        __FUNCTION__ = "sd_tcpinput"
        currsize = 16
        csocket = 46
        skip = false
#14 0x00000000004ba12d in handle_tcp (data=0x803a1e500, rw=pvpgn::fdwatch_type_read) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
No locals.
#15 0x00000000004f397e in pvpgn::FDWKqueueBackend::handle (this=0x802c16100) at /root/pvpgn/il/pvpgn/src/common/fdwatch_kqueue.cpp:42
        cfd = (pvpgn::t_fdwatch_fd *) 0x802d5da28
        i = 0
#16 0x00000000004f228d in pvpgn::fdwatch_handle () at /root/pvpgn/il/pvpgn/src/common/fdwatch.cpp:58
No locals.
#17 0x00000000004bbb83 in _server_mainloop (laddrs=0x803999320) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415195011
---Type <return> to continue, or q <return> to quit---
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1415195022
        track_time = 1415194962
        war3_ladder_updatetime = 1415193402
        output_updatetime = 1415195007
#18 0x00000000004bc139 in pvpgn::bnetd::server_process () at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x803999320
        __FUNCTION__ = "server_process"
#19 0x00000000004ad462 in main (argc=4, argv=0x7fffffffdaf8) at /root/pvpgn/il/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x802c18180 "/var/run/pvpgn/bnetd.pid"
        __FUNCTION__ = "main"
(gdb)

Какие идеи будут?

6

Re: core dump. Сервер падает под freebsd 10

Предполагаю, что это может быть при заполнении свойств аккаунта для Lua объекта.
Нужно попробовать удалить эту строку и проверить.

Do not ask for support in PM.

7

Re: core dump. Сервер падает под freebsd 10

110-ю строку закомментировал, пересобрал.
На этот раз сервер прожил секунд 30:

# gdb ./bnetd ./bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/liblua-5.1.so...done.
Loaded symbols for /usr/local/lib/liblua-5.1.so
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /lib/libreadline.so.8...done.
Loaded symbols for /lib/libreadline.so.8
Reading symbols from /lib/libthr.so.3...done.
Loaded symbols for /lib/libthr.so.3
Reading symbols from /lib/libncurses.so.8...done.
Loaded symbols for /lib/libncurses.so.8
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x0000000800ecb150 in lua_yield () from /usr/local/lib/liblua-5.1.so
[New Thread 802c06400 (LWP 100087/bnetd)]
(gdb) bt full
#0  0x0000000800ecb150 in lua_yield () from /usr/local/lib/liblua-5.1.so
No symbol table info available.
#1  0x0000000800ecb3d0 in lua_yield () from /usr/local/lib/liblua-5.1.so
No symbol table info available.
#2  0x0000000800ecb2c8 in lua_yield () from /usr/local/lib/liblua-5.1.so
No symbol table info available.
#3  0x0000000800ec3eca in lua_pushlstring () from /usr/local/lib/liblua-5.1.so
No symbol table info available.
#4  0x00000000004d8242 in lua::stack::push (this=0x7fffffffd580, v=@0x8032b6c60) at gthr-default.h:218
No locals.
#5  0x00000000004d852b in lua::stack::push<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > (
    this=0x7fffffffd580, v=@0x7fffffffd4a0) at gthr-default.h:218
        i = {_M_node = 0x8032b6c40}
#6  0x00000000004dd976 in lua::bind::operator<< <std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > > > (this=0x7fffffffd580, v=@0x7fffffffd4a0) at /root/pvpgn/il/pvpgn/src/bnetd/luainterface.cpp:93
No locals.
#7  0x00000000004dc686 in pvpgn::bnetd::lua_handle_user (c=0x803a43800, c_dst=0x0, message_text=0x0, luaevent=pvpgn::bnetd::luaevent_user_login)
    at /root/pvpgn/il/pvpgn/src/bnetd/luainterface.cpp:93
        o_account_dst = {_M_t = {
    _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<No data fields>}, <No data fields>}, _M_key_compare = {<std::binary_function<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>> = {<No data fields>}, <No data fields>}, _M_header = {_M_color = 26014940, _M_parent = 0x3120353020766f4e,
        _M_left = 0x30353a36333a37, _M_right = 0x802f8c380}, _M_node_count = 6011272}}}
        o_account = {_M_t = {
    _M_impl = {<std::allocator<std::_Rb_tree_node<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >> = {<No data fields>}, <No data fields>}, _M_key_compare = {<std::binary_function<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool>> = {<No data fields>}, <No data fields>}, _M_header = {_M_color = std::_S_red, _M_parent = 0x8032b6910,
        _M_left = 0x8032b6a60, _M_right = 0x8032b6970}, _M_node_count = 13}}}
        account = (t_account *) 0x8031e0ac0
        account_dst = (t_account *) 0x454f5c
        __FUNCTION__ = "lua_handle_user"
        func_name = 0x5a1a63 "handle_user_login"
        result = 0
#8  0x000000000046f218 in _client_loginreq1 (c=0x803a43800, packet=0x803a4be00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:340
        temp = {ticks = "г\003+", sessionkey = "h\221\233<", passhash1 = {"\220\200ґ\005", "(\\р)", "\227Р\004\032", "3eШ\026", "\"\034-Ш"}}
        oldstrhash1 = 0x8030e2cd0 "05ad809029d25c281a04f29716fb6533fb2d1c22"
        oldpasshash2 = {1751532574, 3279511477, 1591016042, 3065094797, 1373832092}
        trypasshash2 = {1751532574, 3279511477, 1591016042, 3065094797, 1373832092}
        oldpasshash1 = {95256720, 701652008, 436531863, 385574195, 4214037538}
        username = 0x803a4be30 "franth"
        account = (t_account *) 0x8031e0ac0
        rpacket = (t_packet *) 0x803a4cc00
        __FUNCTION__ = "_client_loginreq1"
#9  0x000000000046aa42 in handle (htable=0x566b20, type=10751, c=0x803a43800, packet=0x803a4be00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:344
        p = (const N5pvpgn5bnetd12t_htable_rowE *) 0x566ca0
        res = 0
#10 0x000000000046a7dd in pvpgn::bnetd::handle_bnet_packet (c=0x803a43800, packet=0x803a4be00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:303
        __FUNCTION__ = "handle_bnet_packet"
#11 0x00000000004b9967 in sd_tcpinput (c=0x803a43800) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        ret = 0
        packet = (t_packet *) 0x803a4be00
        __FUNCTION__ = "sd_tcpinput"
---Type <return> to continue, or q <return> to quit---
        currsize = 39
        csocket = 45
        skip = false
#12 0x00000000004ba12d in handle_tcp (data=0x803a43800, rw=pvpgn::fdwatch_type_read) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
No locals.
#13 0x00000000004f38d8 in pvpgn::FDWKqueueBackend::handle (this=0x802c16100) at /root/pvpgn/il/pvpgn/src/common/fdwatch_kqueue.cpp:42
        cfd = (pvpgn::t_fdwatch_fd *) 0x802d5d908
        i = 0
#14 0x00000000004f21e7 in pvpgn::fdwatch_handle () at /root/pvpgn/il/pvpgn/src/common/fdwatch.cpp:58
No locals.
#15 0x00000000004bbb83 in _server_mainloop (laddrs=0x8039994c0) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415198210
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1415198216
        track_time = 1415198186
        war3_ladder_updatetime = 1415198126
        output_updatetime = 1415198201
#16 0x00000000004bc139 in pvpgn::bnetd::server_process () at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x8039994c0
        __FUNCTION__ = "server_process"
#17 0x00000000004ad462 in main (argc=4, argv=0x7fffffffdaf8) at /root/pvpgn/il/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x802c18180 "/var/run/pvpgn/bnetd.pid"
        __FUNCTION__ = "main"
(gdb)

8 (edited by HarpyWar 05.11.2014 18:01)

Re: core dump. Сервер падает под freebsd 10

Пока не вижу, где там могут быть проблемы. Предыдущее предположение было вызвано тем, что версия могла быть NULL у игроков, которые соединяются с клиентом вроде чата (эту строку все-равно нужно удалить, т.к. она объявлена ниже с проверкой, а сверху я её случайно оставил).

Файл программы точно был заменен на новый при повторной проверке? Можно тогда сразу возвращать "return o_account;" в начале этой функции, чтобы исключить из подозрения весь код этой функции.

Do not ask for support in PM.

9

Re: core dump. Сервер падает под freebsd 10

да, файл создан (заменен) 30 минут назад...

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

Пока lua буду тестировать на тестовом сервере, а тут - запущу без lua.
А то юзеры недовольны - слишком часто мол я рабочий сервер перезапускаю...

Может, есть метод, как смоделировать эту проблему на голом сервере без юзеров на соседнем порту?
А то запустил его параллельно на порту 6113, зашел телнетом - команды понабирать - работает гад, не падает.
А с реальной пользовательской нагрузкой - падает. sad

10

Re: core dump. Сервер падает под freebsd 10

Если в функции get_account_object сразу возвращать "return o_account;", то сервер падает?
Во втором случае видно аккаунт "franth", сразу при логине. Думаю, достаточно будет его попросить зайти на второй сервер, чтобы воспроизвести падение.

Do not ask for support in PM.

11

Re: core dump. Сервер падает под freebsd 10

Насчет return o_account попробую попозже, сейчас собрал без lua (-D WITH_LUA=false), и оно-таки все равно упало, правда теперь через 3 часа.

Похоже, что-то где-то в базе равно NULL, и этот NULL не проверяется, только вот какой и где добавить проверку?
Часа 2 втыкал в дамп, пока не соображу:

# gdb ./bnetd ./bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x0000000801679b37 in sbrk () from /lib/libc.so.7
(gdb) bt full
#0  0x0000000801679b37 in sbrk () from /lib/libc.so.7
No symbol table info available.
#1  0x0000000801679ea9 in sbrk () from /lib/libc.so.7
No symbol table info available.
#2  0x00000008016854dc in free () from /lib/libc.so.7
No symbol table info available.
#3  0x0000000800f5e0f0 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string (this=Unhandled dwarf expression opcode 0xf3
) from /usr/local/lib/gcc47/libstdc++.so.6
No locals.
#4  0x00000000004277bc in key_get_tab (key=0x80298cfe0 "Record_W2BN_0_wins") at attr.h:45
        str = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
    _M_p = 0x802e32a78 "Record_W2BN_0_wins"}}
        pos = 6
        find = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x80298e058 "Record"}}
#5  0x0000000000427325 in attrgroup_find_attr (attrgroup=0x802d81100, pkey=0x7fffffffccf8, escape=1) at attr.h:45
        val = 0x0
        curr = (t_hlist *) 0x65e01c11d0e3eca5
        last = (t_hlist *) 0x0
        __func__ = "attrgroup_find_attr"
        last2 = (t_hlist *) 0x0
        attr = (t_attr *) 0x0
#6  0x0000000000427490 in attrgroup_get_attrlow (attrgroup=0x802d81100, key=0x7fffffffcdd0 "Record\\W2BN\\0\\wins", escape=1) at attr.h:45
        val = 0x0
        newkey = 0x80298cfe0 "Record_W2BN_0_wins"
        attr = (t_attr *) 0x2
#7  0x0000000000427595 in pvpgn::bnetd::attrgroup_get_attr (attrgroup=0x802d81100, key=0x7fffffffcdd0 "Record\\W2BN\\0\\wins") at attr.h:45
        __FUNCTION__ = "attrgroup_get_attr"
#8  0x0000000000407cb5 in pvpgn::bnetd::account_get_strattr_real (account=0x802e1d680, key=0x7fffffffcdd0 "Record\\W2BN\\0\\wins", fn=0x523d38 "/root/pvpgn/il/pvpgn/src/bnetd/account_wrap.cpp",
    ln=71) at /root/pvpgn/il/pvpgn/src/bnetd/account.cpp:92
        __FUNCTION__ = "account_get_strattr_real"
#9  0x00000000004095a0 in pvpgn::bnetd::account_get_numattr_real (account=0x802e1d680, key=0x7fffffffcdd0 "Record\\W2BN\\0\\wins", fn=0x523d38 "/root/pvpgn/il/pvpgn/src/bnetd/account_wrap.cpp",
    ln=646) at /root/pvpgn/il/pvpgn/src/bnetd/account_wrap.cpp:71
        temp = 0x7fffffffced0 "W2BN"
        val = 32767
        __FUNCTION__ = "account_get_numattr_real"
#10 0x000000000040aa44 in pvpgn::bnetd::account_get_normal_wins (account=0x802e1d680, clienttag=1462911566) at /root/pvpgn/il/pvpgn/src/bnetd/account_wrap.cpp:148
        key = "Record\\W2BN\\0\\wins\000ected_icon\000\000\000хЬR\000\000\000\000\000@о\230\002\b\000\000\000`нЪЪЪ\177\000\000\nuB", '\0' <repeats 13 times>, "0П\226\001\001\000\000\000UЪS\000\000\000\000\000\000\021ь\002\b\000\000\000\202\000\000\000\000\000\000\000@о\230\002\b", '\0' <repeats 35 times>, "\200нЪЪЪ\177\000\000\225uB\000\000\000\000\000UЪS\000\000\000\000\000\000\021ь\002\b\000\000\000╟нЪЪЪ\177\000\000╣|@\000\000\000\000\000XGю\002\035\005\000\000\230ЭS\000\000\000\000\000UЪS\000\000\000\000\000\200жА\002\b\000\000\000ЮнЪЪ"...
        clienttag_str = "W2BN"
        __FUNCTION__ = "account_get_normal_wins"
#11 0x0000000000457063 in pvpgn::bnetd::conn_get_playerinfo (c=0x802215780) at /root/pvpgn/il/pvpgn/src/bnetd/connection.cpp:125
        a = 0
        b = 0
        account = (t_account *) 0x802e1d680
        clienttag = 1462911566
        usericon = 0x0
        __FUNCTION__ = "conn_get_playerinfo"
        playerinfo = "NB2W 1167 130 1533 0 0 1167 0 0\00022", '\0' <repeats 2013 times>
        revtag = "NB2W"
#12 0x00000000004ae027 in message_bnet_format (packet=0x802e56400, type=pvpgn::bnetd::message_type_adduser, me=0x802215780, dst=0x802219100, text=0x0, dstflags=0)
    at /root/pvpgn/il/pvpgn/src/bnetd/message.cpp:191
        tname = 0x802efd1b0 "HookerSpit"
        playerinfo = 0x200000004 <Address 0x200000004 out of bounds>
        __FUNCTION__ = "message_bnet_format"
        temp = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x8011a5bb8 ""}}
#13 0x00000000004af7ce in message_cache_lookup (message=0x802d8fbc0, dst=0x802219100, dstflags=0) at /root/pvpgn/il/pvpgn/src/bnetd/message.cpp:191
        i = 0
        packet = (t_packet *) 0x802e56400
        __FUNCTION__ = "message_cache_lookup"
        mclass = pvpgn::bnetd::message_class_normal
        cclass = pvpgn::bnetd::conn_class_bnet
#14 0x00000000004afa36 in pvpgn::bnetd::message_send (message=0x802d8fbc0, dst=0x802219100) at /root/pvpgn/il/pvpgn/src/bnetd/message.cpp:191
        packet = (t_packet *) 0x802d8fbc0
        dstflags = 0
        __FUNCTION__ = "message_send"
#15 0x00000000004afcd0 in pvpgn::bnetd::message_send_text (dst=0x802219100, type=pvpgn::bnetd::message_type_adduser, src=0x802215780, text=0x0) at /root/pvpgn/il/pvpgn/src/bnetd/message.cpp:191
        message = (t_message *) 0x802d8fbc0
        rez = 0
---Type <return> to continue, or q <return> to quit---
        __FUNCTION__ = "message_send_text"
#16 0x000000000042a7cb in pvpgn::bnetd::channel_add_connection (channel=0x802009350, connection=0x802219100) at /root/pvpgn/il/pvpgn/src/bnetd/channel.cpp:83
        member = (t_channelmember *) 0x802efd1a0
        user = (t_connection *) 0x802215780
        __FUNCTION__ = "channel_add_connection"
#17 0x00000000004557f5 in pvpgn::bnetd::conn_set_channel (c=0x802219100, channelname=0x802e4ae18 "War2BNE") at /root/pvpgn/il/pvpgn/src/bnetd/connection.cpp:125
        ch_clan = (t_clan *) 0x801971d4c
        channel = (t_channel *) 0x802009350
        oldchannel = (t_channel *) 0x0
        acc = (t_account *) 0x8022b5c00
        curr = (t_elem *) 0x80196edd0
        clan = (t_clan *) 0x0
        member = (t_clanmember *) 0x0
        __FUNCTION__ = "conn_set_channel"
        clantag = 0
        created = 0
#18 0x0000000000474c9c in _client_joinchannel (c=0x802219100, packet=0x802e4ae00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:340
        ostr = {<std::basic_ostream<char, std::char_traits<char> >> = {<std::basic_ios<char, std::char_traits<char> >> = {<std::ios_base> = {_vptr.ios_base = 0x600000010,
        static boolalpha = <optimized out>, static dec = <optimized out>, static fixed = <optimized out>, static hex = <optimized out>, static internal = <optimized out>,
        static left = <optimized out>, static oct = <optimized out>, static right = <optimized out>, static scientific = <optimized out>, static showbase = <optimized out>,
        static showpoint = <optimized out>, static showpos = <optimized out>, static skipws = <optimized out>, static unitbuf = <optimized out>, static uppercase = <optimized out>,
        static adjustfield = <optimized out>, static basefield = <optimized out>, static floatfield = <optimized out>, static badbit = <optimized out>, static eofbit = <optimized out>,
        static failbit = <optimized out>, static goodbit = <optimized out>, static app = <optimized out>, static ate = <optimized out>, static binary = <optimized out>,
        static in = <optimized out>, static out = <optimized out>, static trunc = 3850979413, static beg = <optimized out>, static cur = <optimized out>, static end = 100, _M_precision = 95866,
        _M_width = 4294967297, _M_flags = 4294956352, _M_exception = 32767, _M_streambuf_state = std::_S_goodbit, _M_callbacks = 0x0, _M_word_zero = {_M_pword = 0x0, _M_iword = 0},
        _M_local_word = {{_M_pword = 0x0, _M_iword = 34390490368}, {_M_pword = 0x801d53d00, _M_iword = 0}, {_M_pword = 0x804375f60, _M_iword = 131071}, {_M_pword = 0x0, _M_iword = 0}, {
            _M_pword = 0x600000010, _M_iword = 121028}, {_M_pword = 0x300038323000007b, _M_iword = 3472328296227877427}, {_M_pword = 0xb00373234, _M_iword = 4}, {_M_pword = 0xe00000003,
            _M_iword = 34409855161}}, _M_word_size = 27, _M_word = 0x802fbf9a4, _M_ios_locale = {static none = <optimized out>, static ctype = <optimized out>, static numeric = <optimized out>,
          static collate = <optimized out>, static time = -443987883, static monetary = <optimized out>, static messages = <optimized out>, static all = <optimized out>, _M_impl = 0x600000055,
          static _S_classic = <optimized out>, static _S_global = <optimized out>, static _S_categories = <optimized out>, static _S_once = <optimized out>}}, _M_tie = 0xad30,
      _M_fill = 17 '\021', _M_fill_init = false, _M_streambuf = 0x1300000064, _M_ctype = 0x1300000001, _M_num_put = 0x0, _M_num_get = 0x600000010}, _vptr.basic_ostream = 0x600000010},
  _M_stringbuf = {<std::basic_streambuf<char, std::char_traits<char> >> = {_vptr.basic_streambuf = 0x1767a, _M_in_beg = 0x100000001 <Address 0x100000001 out of bounds>,
      _M_in_cur = 0x7fffffffd540 "\003", _M_in_end = 0x0, _M_out_beg = 0x0, _M_out_cur = 0x0, _M_out_end = 0x0, _M_buf_locale = {static none = <optimized out>, static ctype = <optimized out>,
        static numeric = <optimized out>, static collate = <optimized out>, static time = -443987883, static monetary = <optimized out>, static messages = <optimized out>,
        static all = <optimized out>, _M_impl = 0x0, static _S_classic = <optimized out>, static _S_global = <optimized out>, static _S_categories = <optimized out>,
        static _S_once = <optimized out>}}, _M_mode = 30752000, _M_string = {static npos = <optimized out>,
      _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x801d53d00 ""}}}}
        account = (t_account *) 0x8022b5c00
        clienttag = 1462911566
        channel = (t_channel *) 0x0
        __FUNCTION__ = "_client_joinchannel"
        tmpstr = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x8011a5bb8 ""}}
        cname = 0x802e4ae18 "War2BNE"
        found = 1
        user_clan = (t_clan *) 0x7fffffffd6f0
        clantag = 4294956768
#19 0x0000000000469996 in handle (htable=0x5543c0, type=3327, c=0x802219100, packet=0x802e4ae00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:344
        p = (const N5pvpgn5bnetd12t_htable_rowE *) 0x554570
        res = 0
#20 0x00000000004697fb in pvpgn::bnetd::handle_bnet_packet (c=0x802219100, packet=0x802e4ae00) at /root/pvpgn/il/pvpgn/src/bnetd/handle_bnet.cpp:314
        __FUNCTION__ = "handle_bnet_packet"
#21 0x00000000004b7591 in sd_tcpinput (c=0x802219100) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        ret = 48544768
        packet = (t_packet *) 0x802e4ae00
        __FUNCTION__ = "sd_tcpinput"
        currsize = 16
        csocket = 65
        skip = false
#22 0x00000000004b7d57 in handle_tcp (data=0x802219100, rw=pvpgn::fdwatch_type_read) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
No locals.
#23 0x00000000004e0e32 in pvpgn::FDWKqueueBackend::handle (this=0x80200c0c0) at /root/pvpgn/il/pvpgn/src/common/fdwatch_kqueue.cpp:42
        cfd = (pvpgn::t_fdwatch_fd *) 0x80215f4a0
        i = 0
#24 0x00000000004df741 in pvpgn::fdwatch_handle () at /root/pvpgn/il/pvpgn/src/common/fdwatch.cpp:58
No locals.
#25 0x00000000004b9761 in _server_mainloop (laddrs=0x802cf1800) at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415212417
        __FUNCTION__ = "_server_mainloop"
---Type <return> to continue, or q <return> to quit---
        next_savetime = 1415212435
        track_time = 1415212408
        war3_ladder_updatetime = 1415201365
        output_updatetime = 1415212409
#26 0x00000000004b9d17 in pvpgn::bnetd::server_process () at /root/pvpgn/il/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x802cf1800
        __FUNCTION__ = "server_process"
#27 0x00000000004ab08d in main (argc=3, argv=0x7fffffffdb00) at /root/pvpgn/il/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x802006180 "/var/run/pvpgn/bnetd.pid"
        __FUNCTION__ = "main"
(gdb)

Добавлено: 05.11.2014 23:53

Может, память сожралась?
Сейчас: Mem: 37M Active, 287M Inact, 129M Wired, 7768K Cache, 59M Buf, 15M Free
До этого Free были килобайты. Перезапустил апач, теперь 15М свободно.

Похож этот дамп на переполнение памяти?
Как если key_get_tab не хватило памяти сделать xstrdup(find.c_str()); или что-то вроде того?

И еще может я чего не понял, но меня несколько покоробила реализация функции
static const char *attrgroup_get_attrlow(t_attrgroup *attrgroup, const char *key, int escape)

Может я не понял, но там сначала: const char *newkey = key;
А потом:
attr = attrgroup_find_attr(attrgroup, &newkey, escape);

При этом newkey, а значит и входной агрумент key заменяется в моем случае с "Record\\W2BN\\0\\wins" на "Record_W2BN_0_wins"?

И это притом, что функция вызывается из attrgroup_get_attr, которая в свою очередь вызывается в одном месте вообще с аргументом в виде константы: attrgroup_get_attr(attrgroup, "BNET\\acct\\username")

Чутье подсказывает, что что-то может быть нечисто с этой функцией...

12

Re: core dump. Сервер падает под freebsd 10

Похоже на утечку в key_get_tab, можно возвращать std::string.
Но по идее, при утечке в логах должно было отобразиться "out of memory" https://github.com/HarpyWar/pvpgn/blob/ … oc.cpp#L82

Добавлено: 06.11.2014 14:05

Насчет attrgroup_get_attrlow так и было задумано. Нечисто, но насколько помню проверял - все работает правильно smile

Do not ask for support in PM.

13

Re: core dump. Сервер падает под freebsd 10

Да уж, раз 100 просмотрел key_get_tab - не нашел, где может быть утечка в 4 строках...
Во всяком случае, "_" там есть - не мог не найти.

Может, в случае проблем с памятью ему не хватило ее же, чтобы записать лог?

Хотя у меня реальная память была около нуля - сервер адски тормозил, а своп почти пустой вроде.
Значит, не должна быть память, по идее.
Трудно сказать, я смотрел уже после того, как процесс упал.

Сегодня с утра почистил память - поотключал ненужных демонов, соптимизировал апач - в общем, смотрим, где в следующий раз свалится, а может и повезет?..

Добавлено: 06.11.2014 13:21

Кстати, что там с требованиями к содержимому таблиц базы?

Если win или loss или другие значения - NULL вместо 0 - это должно везде корректно обрабатываться?
Я не чистую базу с нуля заливал, а старую подцепил, от 1.8.5.

И там даже в таблицах BNET, Record, Profile, friends - рассинхрон имеется. Может это приводить к падениям?

14

Re: core dump. Сервер падает под freebsd 10

По xstrdup не уверен, но вероятно нужно после него всегда и везде очищать память. Сделал коммит https://github.com/HarpyWar/pvpgn/commi … b4c19a6077

Если где-то в базе NULL, это в общем допустимо, и к краху приводить не должно. Просто будет ошибка в логе.
Если данные рассинхронизированы (скажем, в клане есть id несуществующих аккаунтов), то лучше их тоже исправить, так как они все-равно не читаются. У меня к краху это не приводило, и не должно (но будут ошибки в логе).

Do not ask for support in PM.

15 (edited by iltmpz 06.11.2014 21:52)

Re: core dump. Сервер падает под freebsd 10

Мне вот интересно, эта новая версия 1.9.9 у всех так работает или это именно я такой везучий?

Соптимизировал память, целый день смотрел, мониторил - 40Мб занимает в памяти процесс и тянет за собой 14-18Мб памяти для ресурсов.
Запустил где-то в 12.
В 18 шел домой - все работало как часы.

Сейчас прихожу домой - сдох, гад!
Версия старая, без сегодняшнего дневного фикса.
Кстати, так и не смог понять, какой в нем смысл:
Раньше функция key_get_tab(*pkey) возвращала результат напрямую в функцию, как я понимаю, в виде адреса на стеке, как я понимаю, get_key_tab сохраняла промежуточные данные тоже на стеке.
А теперь - она возвращает результат в указатель, который тоже лежит на стеке, соответственно, храня промежуточные данные там же...
Разницы в организации и хранении данных не уловил...

Вот следующий дамп из моей эпопеи: вроде бы где-то рядом, но с другой стороны, вроде бы и в другом месте. Но опять не обошлось без моей "любимой" фунции attrgroup_get_attrlow
Версия без дневного апдейта, т.к. я запустил ее раньше, чем он появился:

# gdb ./bnetd ./bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x000000080167fb37 in sbrk () from /lib/libc.so.7
(gdb) bt full
#0  0x000000080167fb37 in sbrk () from /lib/libc.so.7
No symbol table info available.
#1  0x000000080167fea9 in sbrk () from /lib/libc.so.7
No symbol table info available.
#2  0x000000080168b4dc in free () from /lib/libc.so.7
No symbol table info available.
#3  0x00000000004f000b in pvpgn::xfree_real (ptr=0x802dd20b0, fn=0x533b70 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/attrgroup.cpp", ln=450) at /root/pvpgn/HarpyWar/pvpgn/src/common/xalloc.cpp:41
        __FUNCTION__ = "xfree_real"
#4  0x000000000042ced0 in attrgroup_get_attrlow (attrgroup=0x802f106f0, key=0x7fffffffd0e0 "friend\\38\\uid", escape=1) at attr.h:45
        val = 0x802f43b98 "1011822"
        newkey = 0x802dd20b0 "friend_38_uid"
        attr = (t_attr *) 0x802a15f80
#5  0x000000000042cf5b in pvpgn::bnetd::attrgroup_get_attr (attrgroup=0x802f106f0, key=0x7fffffffd0e0 "friend\\38\\uid") at attr.h:45
        __FUNCTION__ = "attrgroup_get_attr"
#6  0x0000000000407c25 in pvpgn::bnetd::account_get_strattr_real (account=0x802f3b3c0, key=0x7fffffffd0e0 "friend\\38\\uid", fn=0x527fd8 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp",
    ln=71) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        __FUNCTION__ = "account_get_strattr_real"
#7  0x0000000000409510 in pvpgn::bnetd::account_get_numattr_real (account=0x802f3b3c0, key=0x7fffffffd0e0 "friend\\38\\uid", fn=0x527fd8 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp",
    ln=1839) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp:71
        temp = 0x802f43b80 "1043251"
        val = 32767
        __FUNCTION__ = "account_get_numattr_real"
#8  0x000000000040e041 in pvpgn::bnetd::account_get_friend (account=0x802f3b3c0, friendnum=38) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp:148
        key = "friend\\38\\uid\000\000\000PяЪЪЪ\177\000\000пнB\000\000\000\000\000@яЪЪЪ\177\000\000\034iN\000\001\000\000\000╣\210R\000\000\000\000\000П\006Я\002\b\000\000\000@яЪЪЪ\177\000\000птэ\002\b\000\000\000═Z║\002\b\000\000\000П7Т\002\b\000\000\000pяЪЪЪ\177\000\000\002\000\000\000\000\000\000\000pяЪЪЪ\177\000\000[оB\000\000\000\000\000╣\210R\000\000\000\000\000П\006Я\002(\000\000\000тяЪЪЪ\177\000\000П7Т\002\b\000\000\000╟яЪЪG\000\000\000ь\177R\000(\000\000\000Р7Т\002\b\000\000\000юЁС\0021\000\000\000ЮяЪЪЪ\177\000\000"...
        tmp = 1043251
        __FUNCTION__ = "account_get_friend"
        name = 0x102a5fffffd210 <Address 0x102a5fffffd210 out of bounds>
        acct = (t_account *) 0x40e21f
#9  0x0000000000408c91 in pvpgn::bnetd::account_check_mutual (account=0x802f3b3c0, myuserid=1036877) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        i = 38
        n = 49
        frienduid = 1043251
        __FUNCTION__ = "account_check_mutual"
#10 0x0000000000408ecb in account_load_friends (account=0x802f3b2c0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        i = 4
        acc = (t_account *) 0x802f3b3c0
        fr = (t_friend *) 0x0
        __FUNCTION__ = "account_load_friends"
        n = 6
        frienduid = 1059423
        newlist = 1
#11 0x0000000000408d29 in pvpgn::bnetd::account_get_friends (account=0x802f3b2c0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        __FUNCTION__ = "account_get_friends"
#12 0x00000000004d4dc5 in pvpgn::bnetd::WatchComponent::dispatch_whisper (this=0x802275a00, account=0x802f3b2c0, gamename=0x0, clienttag=1462911566, event=pvpgn::bnetd::Watch::ET_login)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:83
        flist = (t_list *) 0x5283a6
        my_c = (t_connection *) 0x802218200
        fr = (t_friend *) 0x802dc5c40
        game_title = 0x5a8dc8 "Warcraft II"
        __FUNCTION__ = "dispatch_whisper"
        msg = "═C\200", '\0' <repeats 13 times>, " уЪЪЪ\177\000\000\232;Y\000\000\000\000\000`тЪЪЪ\177\000\000SSo\001\b\000\000\000\b\002ЪЪ\000\000\000\000╛C\200\000\000\000\000\000\000\000ю\002\b\000\000\000ю\000ю\001\b\000\000\0000\000\000\000\000\000\000\000\000\000ю\002\b\000\000\000x9ю\002\b\000\000\000H\003ю\001\b\000\000\000Є8\226\001\b\000\000\000ю\000ю\001\b\000\000\000\220сЪЪЪ\177\000\000╘Чg\001\b\000\000\000P\236Ф\002\b\000\000\000Xk\227\001\b\000\000\000\000\000ю\002\b\000\000\000i\002\000\000\000\000\000\000P\236Ф\002\b\000\000\0009\000\000\000\000\000\000\000ПсЪЪЪ\177\000\000эЄh"...
        dest_c = (t_connection *) 0x801c000c0
        curr = (const t_elem *) 0x802f3b2c0
        cnt = 0
        myusername = 0x802dc5da0 "MultipleOrcasms"
#13 0x00000000004d5279 in pvpgn::bnetd::WatchComponent::dispatch (this=0x802275a00, who=0x802f3b2c0, gamename=0x0, clienttag=1462911566, event=pvpgn::bnetd::Watch::ET_login)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:83
        __FUNCTION__ = "dispatch"
#14 0x0000000000459a2d in conn_set_account (c=0x802218200, account=0x802f3b2c0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        other = (t_connection *) 0x0
        tname = 0x802dc5da0 "MultipleOrcasms"
        __FUNCTION__ = "conn_set_account"
#15 0x0000000000459abe in pvpgn::bnetd::conn_login (c=0x802218200, a=0x802f3b2c0, loggeduser=0x802d71e30 "MultipleOrcasms") at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
---Type <return> to continue, or q <return> to quit---
        __func__ = "conn_login"
#16 0x0000000000473898 in _client_loginreq1 (c=0x802218200, packet=0x802d71e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:340
        temp = {ticks = "х\025\205\r", sessionkey = "\025\210\2162", passhash1 = {"ё|Шд", "AzЁ╞", "&*╙J", "\232,&©", "П╧╗l"}}
        oldstrhash1 = 0x802e69e20 "c4fb7ca3afb37a414aaa2a26bf262c9a6ca8b9f0"
        oldpasshash2 = {4114321487, 52062705, 1377073916, 1750704214, 2743555974}
        trypasshash2 = {4114321487, 52062705, 1377073916, 1750704214, 2743555974}
        oldpasshash1 = {3304815779, 2947775041, 1252665894, 3206950042, 1822996976}
        username = 0x802d71e30 "MultipleOrcasms"
        account = (t_account *) 0x802f3b2c0
        rpacket = (t_packet *) 0x802d72c00
        __FUNCTION__ = "_client_loginreq1"
#17 0x000000000046f12a in handle (htable=0x558440, type=10751, c=0x802218200, packet=0x802d71e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:344
        p = (const N5pvpgn5bnetd12t_htable_rowE *) 0x5585c0
        res = 0
#18 0x000000000046eec5 in pvpgn::bnetd::handle_bnet_packet (c=0x802218200, packet=0x802d71e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:303
        __FUNCTION__ = "handle_bnet_packet"
#19 0x00000000004bce13 in sd_tcpinput (c=0x802218200) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        ret = 0
        packet = (t_packet *) 0x802d71e00
        __FUNCTION__ = "sd_tcpinput"
        currsize = 48
        csocket = 58
        skip = false
#20 0x00000000004bd5d9 in handle_tcp (data=0x802218200, rw=pvpgn::fdwatch_type_read) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
No locals.
#21 0x00000000004e50e4 in pvpgn::FDWKqueueBackend::handle (this=0x80200c0c0) at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch_kqueue.cpp:42
        cfd = (pvpgn::t_fdwatch_fd *) 0x802160f58
        i = 0
#22 0x00000000004e39f3 in pvpgn::fdwatch_handle () at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch.cpp:58
No locals.
#23 0x00000000004befe3 in _server_mainloop (laddrs=0x802d70100) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415294109
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1415294126
        track_time = 1415294066
        war3_ladder_updatetime = 1415270426
        output_updatetime = 1415294096
#24 0x00000000004bf599 in pvpgn::bnetd::server_process () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x802d70100
        __FUNCTION__ = "server_process"
#25 0x00000000004b090f in main (argc=3, argv=0x7fffffffdb00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x802006180 "/var/run/pvpgn/bnetd.pid"
        __FUNCTION__ = "main"
(gdb)

16

Re: core dump. Сервер падает под freebsd 10

На сервере только в варкрафт 2 играют?

Значения переменных вроде такого:

msg = "═C\200", '\0' <repeats 13 times>, " уЪЪЪ\177\000\000\232;Y\000\000\000\000\000`тЪЪЪ\177\000\000SSo\001\b\000\000\000\b\002ЪЪ\000\000\000\000╛C\200\000\000\000\000\000\000\000ю\002\b\000\000\000ю\000ю\001\b\000\000\0000\000\000\000\000\000\000\000\000\000ю\002\b\000\000\000x9ю\002\b\000\000\000H\003ю\001\b\000\000\000Є8\226\001\b\000\000\000ю\000ю\001\b\000\000\000\220сЪЪЪ\177\000\000╘Чg\001\b\000\000\000P\236Ф\002\b\000\000\000Xk\227\001\b\000\000\000\000\000ю\002\b\000\000\000i\002\000\000\000\000\000\000P\236Ф\002\b\000\000\0009\000\000\000\000\000\000\000ПсЪЪЪ\177\000\000эЄh"...

или такого

key = "friend\\38\\uid\000\000\000PяЪЪЪ\177\000\000пнB\000\000\000\000\000@яЪЪЪ\177\000\000\034iN\000\001\000\000\000╣\210R\000\000\000\000\000П\006Я\002\b\000\000\000@яЪЪЪ\177\000\000птэ\002\b\000\000\000═Z║\002\b\000\000\000П7Т\002\b\000\000\000pяЪЪЪ\177\000\000\002\000\000\000\000\000\000\000pяЪЪЪ\177\000\000[оB\000\000\000\000\000╣\210R\000\000\000\000\000П\006Я\002(\000\000\000тяЪЪЪ\177\000\000П7Т\002\b\000\000\000╟яЪЪG\000\000\000ь\177R\000(\000\000\000Р7Т\002\b\000\000\000юЁС\0021\000\000\000ЮяЪЪЪ\177\000\000"...

наводят на мысль, что где-то в коде что-то не так!

Тот фикс что был на gist я удалил, он неправильный. А тот что в последнем коммите просто очищается память через xfree.

Но все же первым делом нужно почистить базу от плохих данных. А тестирование на рабочем сервере все же необходимо, чтобы отловить ошибки! Или нужен бот для тестирования, который бы смог смоделировать много игроков со всеми действиями.

Добавлено: 06.11.2014 22:21

Как вариант, можно проверить стабильность работы с изначальным 1.99-SVN.

Добавлено: 06.11.2014 22:26

(Хотя, с msg и key похоже все в порядке, у них фиксированный тип char.)

Do not ask for support in PM.

17

Re: core dump. Сервер падает под freebsd 10

Да, только в варкрафт 2 smile

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

Да, эти данные меня тоже удивили, ну подумал, мало ли что в стеке от прошлых данных завалялось?..
А к чему относятся эти "repeats 13 times"? К 1 предыдущему символу/подстроке?

Насчет базы гляну сейчас, во всяком случае, во френдах ничего типа подобного мусора я не видел...

И вот, не успел начать смотреть новый дамп, как вот он - еще один:

# gdb ./bnetd ./bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x000000080167fb37 in sbrk () from /lib/libc.so.7
(gdb) bt full
#0  0x000000080167fb37 in sbrk () from /lib/libc.so.7
No symbol table info available.
#1  0x000000080167fea9 in sbrk () from /lib/libc.so.7
No symbol table info available.
#2  0x000000080168b4dc in free () from /lib/libc.so.7
No symbol table info available.
#3  0x0000000800f640f0 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string (this=Unhandled dwarf expression opcode 0xf3
) from /usr/local/lib/gcc47/libstdc++.so.6
No locals.
#4  0x000000000042d231 in key_get_tab (key=0x8040e0 "friend_46_uid") at attr.h:45
        str = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
    _M_p = 0x80297bec8 "friend_46_uid"}}
        pos = 6
        find = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x80268d058 "friend"}}
#5  0x000000000042c887 in _cb_load_attr (key=0x8040e0 "friend_46_uid", val=0x8029eeb80 "72160", data=0x80238aba0) at attr.h:45
        tab = 0x4c6093 "╦Ю@\200"
        is_found = false
        attrgroup = (t_attrgroup *) 0x80238aba0
#6  0x00000000004c69a5 in sql_read_attrs (info=0x8023918c8, cb=0x42c840 <_cb_load_attr>, data=0x80238aba0, ktab=0x8029ee0e8 "friend") at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/storage_sql.cpp:146
        output = 0x8029eeb80 "72160"
        i = 48
        fields = (t_sql_field *) 0x802205600
        fentry = (t_sql_field *) 0x802205780
        tab = (char **) 0x7fc638
        __FUNCTION__ = "sql_read_attrs"
        result = (void *) 0x80201f000
        row = (t_sql_row *) 0x802532028
        uid = 4779
#7  0x000000000042cad7 in pvpgn::bnetd::attrgroup_load (attrgroup=0x80238aba0, tab=0x8029ee0e8 "friend") at attr.h:45
        __func__ = "attrgroup_load"
        __FUNCTION__ = "attrgroup_load"
#8  0x000000000042cd96 in attrgroup_find_attr (attrgroup=0x80238aba0, pkey=0x7fffffffd118, escape=1) at attr.h:45
        val = 0x8028b117c ""
        curr = (t_hlist *) 0x528098
        last = (t_hlist *) 0x72f025ced98
        __func__ = "attrgroup_find_attr"
        tab = 0x8029ee0e8 "friend"
        last2 = (t_hlist *) 0x40953a
        attr = (t_attr *) 0x7fffffffd0f0
#9  0x000000000042cf05 in attrgroup_get_attrlow (attrgroup=0x80238aba0, key=0x528975 "friend\\count", escape=1) at attr.h:45
        val = 0x0
        newkey = 0x802a2edd0 "friend_count"
        attr = (t_attr *) 0x80268b9c0
#10 0x000000000042d00a in pvpgn::bnetd::attrgroup_get_attr (attrgroup=0x80238aba0, key=0x528975 "friend\\count") at attr.h:45
        __FUNCTION__ = "attrgroup_get_attr"
#11 0x0000000000407c25 in pvpgn::bnetd::account_get_strattr_real (account=0x802395240, key=0x528975 "friend\\count", fn=0x528098 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp", ln=71)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        __FUNCTION__ = "account_get_strattr_real"
#12 0x0000000000409510 in pvpgn::bnetd::account_get_numattr_real (account=0x802395240, key=0x528975 "friend\\count", fn=0x528098 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp", ln=1880)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp:71
        temp = 0x1d40268b9c0 <Address 0x1d40268b9c0 out of bounds>
        val = 32767
        __FUNCTION__ = "account_get_numattr_real"
#13 0x000000000040e21f in pvpgn::bnetd::account_get_friendcount (account=0x802395240) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp:148
No locals.
#14 0x0000000000408c74 in pvpgn::bnetd::account_check_mutual (account=0x802395240, myuserid=1665) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        i = 8
        n = 860
        frienduid = 40416608
        __FUNCTION__ = "account_check_mutual"
#15 0x0000000000408ecb in account_load_friends (account=0x80242d300) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        i = 9
        acc = (t_account *) 0x802395240
        fr = (t_friend *) 0x0
        __FUNCTION__ = "account_load_friends"
        n = 21
        frienduid = 4779
        newlist = 1
#16 0x0000000000408d29 in pvpgn::bnetd::account_get_friends (account=0x80242d300) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
---Type <return> to continue, or q <return> to quit---
        __FUNCTION__ = "account_get_friends"
#17 0x00000000004d4e73 in pvpgn::bnetd::WatchComponent::dispatch_whisper (this=0x802275a00, account=0x80242d300, gamename=0x0, clienttag=1462911566, event=pvpgn::bnetd::Watch::ET_login)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:83
        flist = (t_list *) 0x528466
        my_c = (t_connection *) 0x802218700
        fr = (t_friend *) 0x802a2e200
        game_title = 0x5a8e88 "Warcraft II"
        __FUNCTION__ = "dispatch_whisper"
        msg = "юC\200", '\0' <repeats 13 times>, "\020уЪЪЪ\177\000\000Z<Y\000\000\000\000\000PтЪЪЪ\177\000\000SSo\001\b\000\000\000\b\002ЪЪ\000\000\000\000лC\200\000\000\000\000\000\000\000\200\002\b\000\000\000ю\000ю\001\b\000\000\0000\000\000\000\000\000\000\000\000\000\200\002\b\000\000\000(#\200\002\b\000\000\000H\003ю\001\b\000\000\000Є8\226\001\b\000\000\000ю\000ю\001\b\000\000\000\200сЪЪЪ\177\000\000╘Чg\001\b\000\000\000\000\000\200\002\b\000\000\000ю\000ю\001\b\000\000\000\b\000\000\000\000\000\000\000\000\000\200\002\b\000\000\000П-\200\002\b\000\000\000х\001ю\001\b\000\000\000Є8\226\001\b\000\000\000ю\000ю"...
        dest_c = (t_connection *) 0x801c000c0
        curr = (const t_elem *) 0x80242d300
        cnt = 0
        myusername = 0x8024326b0 "ZekeEmpire"
#18 0x00000000004d5327 in pvpgn::bnetd::WatchComponent::dispatch (this=0x802275a00, who=0x80242d300, gamename=0x0, clienttag=1462911566, event=pvpgn::bnetd::Watch::ET_login)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:83
        __FUNCTION__ = "dispatch"
#19 0x0000000000459adb in conn_set_account (c=0x802218700, account=0x80242d300) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        other = (t_connection *) 0x0
        tname = 0x8024326b0 "ZekeEmpire"
        __FUNCTION__ = "conn_set_account"
#20 0x0000000000459b6c in pvpgn::bnetd::conn_login (c=0x802218700, a=0x80242d300, loggeduser=0x802c06e30 "ZekeEmpire") at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        __func__ = "conn_login"
#21 0x0000000000473946 in _client_loginreq1 (c=0x802218700, packet=0x802c06e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:340
        temp = {ticks = "~c=\005", sessionkey = "\204&\022'", passhash1 = {"\230н\231k", "\036К\030з", "~кN╩", "65л\217", "%\220\023В"}}
        oldstrhash1 = 0x80297bee0 "6b99ce98da18eb1ebb4ecb7e8fcc3536f7139025"
        oldpasshash2 = {1426807850, 2393372370, 3902209990, 3233676754, 907127463}
        trypasshash2 = {1426807850, 2393372370, 3902209990, 3233676754, 907127463}
        oldpasshash1 = {1805242008, 3659066142, 3142503294, 2412524854, 4145254437}
        username = 0x802c06e30 "ZekeEmpire"
        account = (t_account *) 0x80242d300
        rpacket = (t_packet *) 0x802c07c00
        __FUNCTION__ = "_client_loginreq1"
#22 0x000000000046f1d8 in handle (htable=0x558500, type=10751, c=0x802218700, packet=0x802c06e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:344
        p = (const N5pvpgn5bnetd12t_htable_rowE *) 0x558680
        res = 0
#23 0x000000000046ef73 in pvpgn::bnetd::handle_bnet_packet (c=0x802218700, packet=0x802c06e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:303
        __FUNCTION__ = "handle_bnet_packet"
#24 0x00000000004bcec1 in sd_tcpinput (c=0x802218700) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        ret = 0
        packet = (t_packet *) 0x802c06e00
        __FUNCTION__ = "sd_tcpinput"
        currsize = 43
        csocket = 65
        skip = false
#25 0x00000000004bd687 in handle_tcp (data=0x802218700, rw=pvpgn::fdwatch_type_read) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
No locals.
#26 0x00000000004e5192 in pvpgn::FDWKqueueBackend::handle (this=0x80200c0c0) at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch_kqueue.cpp:42
        cfd = (pvpgn::t_fdwatch_fd *) 0x80215e1c8
        i = 0
#27 0x00000000004e3aa1 in pvpgn::fdwatch_handle () at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch.cpp:58
No locals.
#28 0x00000000004bf091 in _server_mainloop (laddrs=0x802b76c80) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415300819
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1415300837
        track_time = 1415300777
        war3_ladder_updatetime = 1415297897
        output_updatetime = 1415300807
#29 0x00000000004bf647 in pvpgn::bnetd::server_process () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x802b76c80
        __FUNCTION__ = "server_process"
#30 0x00000000004b09bd in main (argc=3, argv=0x7fffffffdaf0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x802006180 "/var/run/pvpgn/bnetd.pid"
        __FUNCTION__ = "main"
(gdb)

18 (edited by HarpyWar 06.11.2014 23:21)

Re: core dump. Сервер падает под freebsd 10

Про чистку базы я имел в виду рассинхронизированные данные, которые ни к чему не относятся! (по ошибкам из логов, если такие появляются)
repeats 13 times скорее всего повторение предыдущего символа (нулей). Вообще, дапмы из линукса почти впервые смотрю.

А в последнем дампе явно что-то не то! (tab = 0x4c6093 "╦Ю@\200"). Там случайно не измененный код с gist'a, который я разместил до коммита на github?

Do not ask for support in PM.

19 (edited by iltmpz 06.11.2014 23:29)

Re: core dump. Сервер падает под freebsd 10

Так, ну, таблицы BNET, friend, profile, Record выровнял. Прямо на живом сервере.
Как сдохнет - проверю.
Надо будет такую чистку наверно в крон засунуть потом, а то бывают глюки - юзер создался, а в половине таблиц записей нет.

Действительно, были и данные во всех таблицах, которых не было в BNET, были и данные в только BNET, которых не было в других.

Мне еще интересно - ссылки на удаленных френдов - что с ними делать? Оно само перестроится или мне разбираться, писать мегазапрос и вычеркивать кого больше нет?

А что за gist такой? Я вообще про него не в курсе. Стянул коммит с github, и пересобрал...

А насчет пройтись про ошибкам в логах - это хорошая мысль, обязательно сделаю в ближайшее время

Добавлено: 06.11.2014 23:14

Снова приехали.
Теперь за коннекшены взялся, правда, после того, как я данные на ходу из таблиц поудалял.
Правда, минут через 30 после этого.

# gdb ./bnetd ./bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x000000080167faf3 in sbrk () from /lib/libc.so.7
(gdb) bt full
#0  0x000000080167faf3 in sbrk () from /lib/libc.so.7
No symbol table info available.
#1  0x000000080167fea9 in sbrk () from /lib/libc.so.7
No symbol table info available.
#2  0x000000080168b4dc in free () from /lib/libc.so.7
No symbol table info available.
#3  0x00000000004f00b9 in pvpgn::xfree_real (ptr=0x8026723b0, fn=0x544000 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp", ln=619) at /root/pvpgn/HarpyWar/pvpgn/src/common/xalloc.cpp:41
        __FUNCTION__ = "xfree_real"
#4  0x0000000000457e7e in pvpgn::bnetd::conn_destroy (c=0x802219100, elem=0x7fffffffd820, conn_or_dead_list=1) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        classstr = 0x543e52 "bnet"
        curr = (t_elem *) 0x0
        __FUNCTION__ = "conn_destroy"
#5  0x000000000045e414 in pvpgn::bnetd::connlist_reap () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        curr = (t_elem *) 0x80290f200
        c = (t_connection *) 0x802219100
        __FUNCTION__ = "connlist_reap"
#6  0x00000000004bf096 in _server_mainloop (laddrs=0x8027e6600) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415306952
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1415306971
        track_time = 1415306911
        war3_ladder_updatetime = 1415300971
        output_updatetime = 1415306941
#7  0x00000000004bf647 in pvpgn::bnetd::server_process () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x8027e6600
        __FUNCTION__ = "server_process"
#8  0x00000000004b09bd in main (argc=3, argv=0x7fffffffdaf0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x802006180 "/var/run/pvpgn/bnetd.pid"
        __FUNCTION__ = "main"
(gdb) q

20

Re: core dump. Сервер падает под freebsd 10

Если юзер существует, но записей в других таблицах для него нет, то это нормально. Если записи в других таблицах есть, но юзера не существует, то это ненормально.
Такие потерявшиеся записи в record и profile навряд ли на что то повлияют. А вот в clanmember или в friends желательно проверить и удалить, если нашлись.
Возможно, проблема падений вовсе не в этом, но в любом случае это не помешает.

Про gist можно забыть smile

Все же лучше сначала проверить несколько стабильно сервер будет работать на предыдущей 1.99 версии, чтобы понять от чего отталкиваться. Слишком много ошибок из разных мест  Ведь раньше он работал на 1.8.5?

Do not ask for support in PM.

21

Re: core dump. Сервер падает под freebsd 10

Да, на 1.8.5.

Я так понимаю, нынешний 1.9.9 пишется, тестируется и работает исключительно под win?
Попробую запустить его на старой 1.9.9 завтра.

Из ошибок в логах остались:
got unknown language tag - кривой клиент
handle_bnet_packet: [23] unknown (logged in) bnet packet type 0x14ff, len 8 - что это?..
sql_write_attrs: found NULL value in attributes list (BNET_acct_lastlogin_owner) - выловил, и хорошо.
handle_init_packet: [55] too many connections from address - кто-то проводил "эксперименты"?
game_sanity_check: some, but not all players had a draw count=4 - кривой репорт

Warning'ов вообще интересных не увидел.

Френдов я почистил, во всяком случае, строки совпадают по uid-ам со строками из других таблиц. А вот номера френдов в каждой ячейке очень даже запросто могут указывать на несуществующие уиды, и защита от этого должна где-нибудь быть.
Кстати, нет какого-нибудь мегаскрипта для чистки таблицы несуществующих френдов? Или самому писать?
А вот и свеженькая кора:

# gdb ./bnetd ./bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x00000008016846b0 in sbrk () from /lib/libc.so.7
(gdb) bt full
#0  0x00000008016846b0 in sbrk () from /lib/libc.so.7
No symbol table info available.
#1  0x000000080167fb59 in sbrk () from /lib/libc.so.7
No symbol table info available.
#2  0x000000080167fea9 in sbrk () from /lib/libc.so.7
No symbol table info available.
#3  0x000000080168b4dc in free () from /lib/libc.so.7
No symbol table info available.
#4  0x0000000800f640f0 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string (this=Unhandled dwarf expression opcode 0xf3
) from /usr/local/lib/gcc47/libstdc++.so.6
No locals.
#5  0x000000000042d231 in key_get_tab (key=0x8040e0 "BNET_acct_passhash1") at attr.h:45
        str = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
    _M_p = 0x8029c6568 "BNET_acct_passhash1"}}
        pos = 4
        find = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x8026bbff8 "BNET"}}
#6  0x000000000042c887 in _cb_load_attr (key=0x8040e0 "BNET_acct_passhash1", val=0x8029c64c0 "8a4d108491643daf84a87e2c271836d41e5666f8", data=0x802998790) at attr.h:45
        tab = 0x4c6093 "╦Ю@\200"
        is_found = false
        attrgroup = (t_attrgroup *) 0x802998790
#7  0x00000000004c69a5 in sql_read_attrs (info=0x8029d4590, cb=0x42c840 <_cb_load_attr>, data=0x802998790, ktab=0x8029d4b48 "BNET") at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/storage_sql.cpp:146
        output = 0x8029c64c0 "8a4d108491643daf84a87e2c271836d41e5666f8"
        i = 4
        fields = (t_sql_field *) 0x802232000
        fentry = (t_sql_field *) 0x802232020
        tab = (char **) 0x7fc620
        __FUNCTION__ = "sql_read_attrs"
        result = (void *) 0x802219600
        row = (t_sql_row *) 0x802533028
        uid = 30657
#8  0x000000000042cad7 in pvpgn::bnetd::attrgroup_load (attrgroup=0x802998790, tab=0x8029d4b48 "BNET") at attr.h:45
        __func__ = "attrgroup_load"
        __FUNCTION__ = "attrgroup_load"
#9  0x000000000042cd96 in attrgroup_find_attr (attrgroup=0x802998790, pkey=0x7fffffffd0b8, escape=1) at attr.h:45
        val = 0x801c000c0 ""
        curr = (t_hlist *) 0x802540000
        last = (t_hlist *) 0x801c000c8
        __func__ = "attrgroup_find_attr"
        tab = 0x8029d4b48 "BNET"
        last2 = (t_hlist *) 0x801c000c0
        attr = (t_attr *) 0x5f
#10 0x000000000042cf05 in attrgroup_get_attrlow (attrgroup=0x802998790, key=0x526914 "BNET\\acct\\username", escape=1) at attr.h:45
        val = 0x0
        newkey = 0x8026bbf20 "BNET_acct_username"
        attr = (t_attr *) 0x8021854c0
#11 0x000000000042d00a in pvpgn::bnetd::attrgroup_get_attr (attrgroup=0x802998790, key=0x526914 "BNET\\acct\\username") at attr.h:45
        __FUNCTION__ = "attrgroup_get_attr"
#12 0x0000000000407c25 in pvpgn::bnetd::account_get_strattr_real (account=0x8029c1a40, key=0x526914 "BNET\\acct\\username", fn=0x5268a8 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp", ln=747)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        __FUNCTION__ = "account_get_strattr_real"
#13 0x0000000000408b62 in pvpgn::bnetd::account_get_name_real (account=0x8029c1a40, fn=0x5268a8 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp", ln=607)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        temp = 0x40 <Address 0x40 out of bounds>
        __FUNCTION__ = "account_get_name_real"
#14 0x000000000040861e in accountlist_add_account (account=0x8029c1a40) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        uid = 0
        username = 0x77c1ffffd1e0 <Address 0x77c1ffffd1e0 out of bounds>
        __FUNCTION__ = "accountlist_add_account"
#15 0x0000000000407dfb in account_load_new (name=0x0, uid=30657) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        account = (t_account *) 0x8029c1a40
        attrgroup = (t_attrgroup *) 0x802998790
        __FUNCTION__ = "account_load_new"
#16 0x00000000004084bf in pvpgn::bnetd::accountlist_find_account_by_uid (uid=30657) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        curr = (t_entry *) 0x0
        account = (t_account *) 0x8022986c0
#17 0x0000000000408e6a in account_load_friends (account=0x8023fd180) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        i = 1
        acc = (t_account *) 0x8029c1a00
        fr = (t_friend *) 0x0
---Type <return> to continue, or q <return> to quit---
        __FUNCTION__ = "account_load_friends"
        n = 23
        frienduid = 30657
        newlist = 1
#18 0x0000000000408d29 in pvpgn::bnetd::account_get_friends (account=0x8023fd180) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/account.cpp:92
        __FUNCTION__ = "account_get_friends"
#19 0x00000000004d4e73 in pvpgn::bnetd::WatchComponent::dispatch_whisper (this=0x802275a00, account=0x8023fd180, gamename=0x0, clienttag=1462911566, event=pvpgn::bnetd::Watch::ET_login)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:83
        flist = (t_list *) 0x528466
        my_c = (t_connection *) 0x802219100
        fr = (t_friend *) 0x8029d6ac0
        game_title = 0x5a8e88 "Warcraft II"
        __FUNCTION__ = "dispatch_whisper"
        msg = "\000D\200", '\0' <repeats 13 times>, " уЪЪЪ\177\000\000Z<Y\000\000\000\000\000`тЪЪЪ\177\000\000SSo\001\b\000\000\000\b\002ЪЪ\000\000\000\000\rD\200\000\000\000\000\000\000\000\200\002\b\000\000\000ю\000ю\001\b\000\000\0000\000\000\000\000\000\000\000\000\000\200\002\b\000\000\0000*\200\002\b\000\000\000H\003ю\001\b\000\000\000Є8\226\001\b\000\000\000ю\000ю\001\b\000\000\000\220сЪЪЪ\177\000\000╘Чg\001\b\000\000\000\000\000\200\002\b\000\000\000ю\000ю\001\b\000\000\000\b\000\000\000\000\000\000\000\000\000\200\002\b\000\000\000\200+\200\002\b\000\000\000х\001ю\001\b\000\000\000Є8\226\001\b\000\000\000ю\000ю"...
        dest_c = (t_connection *) 0x801c000c0
        curr = (const t_elem *) 0x8023fd180
        cnt = 0
        myusername = 0x8024312d0 "lynardskynard"
#20 0x00000000004d5327 in pvpgn::bnetd::WatchComponent::dispatch (this=0x802275a00, who=0x8023fd180, gamename=0x0, clienttag=1462911566, event=pvpgn::bnetd::Watch::ET_login)
    at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:83
        __FUNCTION__ = "dispatch"
#21 0x0000000000459adb in conn_set_account (c=0x802219100, account=0x8023fd180) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        other = (t_connection *) 0x0
        tname = 0x8024312d0 "lynardskynard"
        __FUNCTION__ = "conn_set_account"
#22 0x0000000000459b6c in pvpgn::bnetd::conn_login (c=0x802219100, a=0x8023fd180, loggeduser=0x802b86e30 "lynardskynard") at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        __func__ = "conn_login"
#23 0x0000000000473946 in _client_loginreq1 (c=0x802219100, packet=0x802b86e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:340
        temp = {ticks = "бiБ\\", sessionkey = "\017UGe", passhash1 = {"іqЁ8", "J!ж╔", "╪d}q", "r:%ш", "dНg\031"}}
        oldstrhash1 = 0x8029c64f0 "38b371a6a5d6234a717d64bcdb253a721967ee64"
        oldpasshash2 = {536894515, 35474173, 6852531, 451506564, 1212054629}
        trypasshash2 = {536894515, 35474173, 6852531, 451506564, 1212054629}
        oldpasshash1 = {951284134, 2782273866, 1904043196, 3676650098, 426241636}
        username = 0x802b86e30 "lynardskynard"
        account = (t_account *) 0x8023fd180
        rpacket = (t_packet *) 0x802b87c00
        __FUNCTION__ = "_client_loginreq1"
#24 0x000000000046f1d8 in handle (htable=0x558500, type=10751, c=0x802219100, packet=0x802b86e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:344
        p = (const N5pvpgn5bnetd12t_htable_rowE *) 0x558680
        res = 0
#25 0x000000000046ef73 in pvpgn::bnetd::handle_bnet_packet (c=0x802219100, packet=0x802b86e00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:303
        __FUNCTION__ = "handle_bnet_packet"
#26 0x00000000004bcec1 in sd_tcpinput (c=0x802219100) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        ret = 0
        packet = (t_packet *) 0x802b86e00
        __FUNCTION__ = "sd_tcpinput"
        currsize = 46
        csocket = 66
        skip = false
#27 0x00000000004bd687 in handle_tcp (data=0x802219100, rw=pvpgn::fdwatch_type_read) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
No locals.
#28 0x00000000004e5192 in pvpgn::FDWKqueueBackend::handle (this=0x80200c0c0) at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch_kqueue.cpp:42
        cfd = (pvpgn::t_fdwatch_fd *) 0x80215e888
        i = 0
#29 0x00000000004e3aa1 in pvpgn::fdwatch_handle () at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch.cpp:58
No locals.
#30 0x00000000004bf091 in _server_mainloop (laddrs=0x8027f89e0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415311647
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1415311677
        track_time = 1415311647
        war3_ladder_updatetime = 1415307147
        output_updatetime = 1415311634
#31 0x00000000004bf647 in pvpgn::bnetd::server_process () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x8027f89e0
---Type <return> to continue, or q <return> to quit---
        __FUNCTION__ = "server_process"
#32 0x00000000004b09bd in main (argc=3, argv=0x7fffffffdb08) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x802006180 "/var/run/pvpgn/bnetd.pid"
        __FUNCTION__ = "main"
(gdb)

22

Re: core dump. Сервер падает под freebsd 10

Сервер пишется на Windows, на Linux тестирую только платформозависимый код.
Скрипт для очистки френдов не видел.
Можно мне получить дамп базы данных сервера и лог файл, исключительно в целях локального тестирования? harpywar@gmail.com

Do not ask for support in PM.

23

Re: core dump. Сервер падает под freebsd 10

В общем, начал вникать в код, который может приводить к моим ошибкам.
Предложения:
1. функция attrgroup_get_attrlow требует рефакторинга, это без вариантов. Я постараюсь понять ее устройство и переписать со всеми проверками на корректность. Чтобы она никогда не падала и возвращала либо валидный char *, либо 0 aka NULL.

2. возвращаемое значение должно везде проверяться на возможный NULL.
Проверка выявила, что возвращаемое значение в итоге возвращается функцией account_get_strattr.
Далее, были выявлены 2 случая отсутствия проверки возвращаемого значения. В результате них, программа не просто может, а БУДЕТ практически наверняка падать в кору при возврате NULL.
Вот эти случаи, прошу добавить проверку:

./bnetd/account_wrap.cpp

extern t_clienttag account_get_ll_clienttag(t_account * account)
                {
                        char const * clienttag;
                        t_clienttag clienttag_uint;

                        clienttag = account_get_strattr(account, "BNET\\acct\\lastlogin_clienttag");
                        clienttag_uint = tag_str_to_uint(clienttag);

                        return clienttag_uint;
                }

./bnetd/luafunctions.cpp
                
                /* Get account attribute value */
                extern int __account_get_attr(lua_State* L)
............                
                                        switch ((t_attr_type)attrtype)
                                        {
                                        case attr_type_str:
                                                if (const char * val = account_get_strattr(account, attrkey))
                                                        st.push(val);
                                                break;

Добавлено: 07.11.2014 16:38

А можно вопрос касаемый стиля кода?

Во многих функциях используется логика такого вида:
function(const char *key)
{
const char *newkey = key;
...
newkey2 = xstrdup(key);
...
}

И далее сравнения производятся с newkey вместо key,
а присваивания - с newkey2...

Например, в функциях: attrgroup_escape_key, sql_escape_key, attrgroup_get_attrlow и т.п.
В этом есть какой-то замысел? Типа борьбы с ошибками компилятора или пропускание всего через xstrdup с заделом на будущую отладку?

24

Re: core dump. Сервер падает под freebsd 10

По-моему, в обоих случаях все в порядке?
1) Если clienttag = NULL, то он обработается в функции tag_str_to_uint и вернет 0
2) Если val = NULL, то st.push(val); не будет выполнен.

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

В последнем и предпоследнем core (там где attrgroup_get_attrlow) прослеживается падение в бд именно при получении списка друзей через account_get_friends. Так что, возможно что-то не так с их обработкой (присланный на емейл дамп БД пока не смотрел по этому вопросу).
Сегодня прошелся PVS Studio по коду и исправил некоторые вероятные ошибки, обновления в последнем коммите.

Do not ask for support in PM.

25 (edited by iltmpz 08.11.2014 00:23)

Re: core dump. Сервер падает под freebsd 10

Да, по 1 действительно tag_str_to_uint вернет 0, не знаю почему я этого не увидел...

По 2 - и опять приходится согласиться - я понятия не имею как устроен механизм lua и должен срабатывать этот push всегда или только если значение не null...

Сегодня поразбирался с функциями из attrgroup.cpp, кое-что попереписывал, подобовлял проверок на NULL, в общем, еще немного доделаю, потестирую, если падения прекратятся, то сделаю pull request...

За наводку про account_get_friends спасибо - тоже погляжу, что там можно проверять, чтобы выловить причину падений...

Да, рефакторинг при помощи VPS Studio очень грамотный - просто огромное количество уязвимостей исправлено. Прямо смотрю и радуюсь. Сколько бы это руками пришлось искать...

Добавлено: 08.11.2014 01:39

Эх.

Обновился, пересобрал, запустил на левом порту, зашел телнетом, нажал ентер - сервер упал.

Сделал revert коммита refactoring and fix code warnings from PVS Studio
Пересобрал, зашел телнетом нажал ентер, набрал пароль, зашел - все работает.

Что-то не так с этим коммитом, похоже:
refactoring and fix code warnings from PVS Studio

# gdb ./bnetd ./bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x00000000004e88a2 in pvpgn::packet_del_ref (packet=0x65757274) at /root/pvpgn/HarpyWar/pvpgn/src/common/packet.cpp:39
39                      if (pclass != packet_class_init &&
(gdb) bt full
#0  0x00000000004e88a2 in pvpgn::packet_del_ref (packet=0x65757274) at /root/pvpgn/HarpyWar/pvpgn/src/common/packet.cpp:39
        __FUNCTION__ = "packet_del_ref"
#1  0x00000000004b4c54 in pvpgn::bnetd::message_destroy (message=0x802b5b380) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/message.cpp:191
        i = 0
        __FUNCTION__ = "message_destroy"
#2  0x00000000004b56ae in pvpgn::bnetd::message_send_text (dst=0x802213580, type=pvpgn::bnetd::message_type_info, src=0x802213580,
    text=0x802252a01 "BOT or Telnet Connection from [62.113.223.150]") at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/message.cpp:191
        message = (t_message *) 0x802b5b380
        rez = 0
        __FUNCTION__ = "message_send_text"
#3  0x00000000004b5985 in pvpgn::bnetd::message_send_formatted (dst=0x802213580, text=0x802b5b340 "BOT or Telnet Connection from [%r]") at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/message.cpp:191
        line = 0x802252a00 "IBOT or Telnet Connection from [62.113.223.150]"
        __FUNCTION__ = "message_send_formatted"
#4  0x00000000004b5a5d in pvpgn::bnetd::message_send_file (dst=0x802213580, fd=0x802278d48) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/message.cpp:191
        buff = 0x802b5b340 "BOT or Telnet Connection from [%r]"
        __FUNCTION__ = "message_send_file"
#5  0x0000000000456dfb in conn_send_issue (c=0x802213580) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        filename = 0x8020077c0 "/usr/local/pvpgn-1.9.9/etc/bnissue.txt"
        fp = (FILE *) 0x802278d48
        __FUNCTION__ = "conn_send_issue"
#6  0x00000000004588a3 in pvpgn::bnetd::conn_set_class (c=0x802213580, cclass=pvpgn::bnetd::conn_class_telnet) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        rpacket = (t_packet *) 0x802213580
        data = {n = 8595841784, p = 0x2005a22f8}
        delta = 4334865920
        oldclass = pvpgn::bnetd::conn_class_init
        __FUNCTION__ = "conn_set_class"
#7  0x0000000000483542 in pvpgn::bnetd::handle_init_packet (c=0x802213580, packet=0x80260ce00) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_init.cpp:57
        __FUNCTION__ = "handle_init_packet"
#8  0x00000000004bcf44 in sd_tcpinput (c=0x802213580) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        ret = 0
        packet = (t_packet *) 0x80260ce00
        __FUNCTION__ = "sd_tcpinput"
        currsize = 1
        csocket = 26
        skip = false
#9  0x00000000004bd725 in handle_tcp (data=0x802213580, rw=pvpgn::fdwatch_type_read) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
No locals.
#10 0x00000000004e5224 in pvpgn::FDWKqueueBackend::handle (this=0x80200c0c0) at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch_kqueue.cpp:42
        cfd = (pvpgn::t_fdwatch_fd *) 0x80215d0e0
        i = 0
#11 0x00000000004e3b34 in pvpgn::fdwatch_handle () at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch.cpp:58
No locals.
#12 0x00000000004bf12f in _server_mainloop (laddrs=0x802b808e0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415403221
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1415403248
        track_time = 1415403218
        war3_ladder_updatetime = 1415403218
        output_updatetime = 1415403218
#13 0x00000000004bf6e5 in pvpgn::bnetd::server_process () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x802b808e0
        __FUNCTION__ = "server_process"
#14 0x00000000004b0a29 in main (argc=4, argv=0x7fffffffdb10) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x8020061a0 "/var/run/pvpgn/bnetd1.pid"
        __FUNCTION__ = "main"
(gdb)

26

Re: core dump. Сервер падает под freebsd 10

Действительно, ошибся в message.cpp. Цикл for в проверку занес и переменная i оказалась неинициализированной, которая потом используется.

Касательно второй проверки, там ведь до push проверяется! И так во многих местах в коде:

if (const char * val = account_get_strattr(account, attrkey))
   st.push(val);

тоже самое, что и

const char * val = account_get_strattr(account, attrkey);
if (val)
   st.push(val);

или

const char * val = account_get_strattr(account, attrkey);
if (val != NULL)
   st.push(val);

Из PVS Studio остались пара вопросов, по которым моих дилетантских знаний C++ не хватает для корректного принятия решения https://github.com/HarpyWar/pvpgn/issues/118
Но радоваться пока рано, нужно добиться чтобы вообще падений не было!

Добавлено: 08.11.2014 13:29

Кстати, последний стек вызовов несколько странный, если это та ошибка, которую я исправил. Указывает совсем не на то место, куда следовало бы - ошибка была в message_cache_lookup.

Добавлено: 08.11.2014 13:41

Хотя, в целом все верно до message_send_text (включительно).  А дальше ещё две функции внутрь message_send и message_cache_lookup, падало на строке "message->packets[i} = packet;", gdb почему-то их проигнорировал. И по нему получается не так просто найти истинную причину ошибки, что видно и по предыдущим дампам sad
Дамп в Windows дает более точный результат!

Do not ask for support in PM.

27 (edited by iltmpz 08.11.2014 21:30)

Re: core dump. Сервер падает под freebsd 10

Да, с этим исправлением телнетом на сервер на левом порту захожу, и все работатет.

По вопросам из PVS Studio я тоже не в курсе, я вообще C++ не знаю...

Подумал тут насчет своих падений перечитывая дампы - не нравится мне этот мусор во входных параметрах. В частности, эти <Address ... out of bounds>. Откуда вообще в логике программы может взяться заведомо неверный адрес? Судя по количеству ошибок в стеке на момент некоторых падений, как бы не оказалось где-нибудь переполнения строки, затирающее соседние переменные, включая указатели. И как его тогда отлавливать?..

Добавлено: 08.11.2014 19:21

Так, запустил со всеми соммитами, все хорошо проработало полтора часа и вывалилось в какого-то овнера:

# gdb ./bnetd /bnetd.core
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x00000000004d4ace in pvpgn::bnetd::Watch::getOwner (this=0x800676f7c) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:50
50                                      return owner;
(gdb) bt full
#0  0x00000000004d4ace in pvpgn::bnetd::Watch::getOwner (this=0x800676f7c) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:50
No locals.
#1  0x00000000004d4dec in pvpgn::bnetd::WatchComponent::del (this=0x802275a00, owner=0x802215780) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:83
        it = {_M_node = 0x800676f6c}
#2  0x0000000000457eb8 in pvpgn::bnetd::conn_destroy (c=0x802215780, elem=0x7fffffffd820, conn_or_dead_list=1) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        classstr = 0x543ed2 "bnet"
        curr = (t_elem *) 0x0
        __FUNCTION__ = "conn_destroy"
#3  0x000000000045e4f1 in pvpgn::bnetd::connlist_reap () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/connection.cpp:125
        curr = (t_elem *) 0x802616c40
        c = (t_connection *) 0x802215780
        __FUNCTION__ = "connlist_reap"
#4  0x00000000004bf138 in _server_mainloop (laddrs=0x802bac620) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        prev_time = 1415463242
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1415463243
        track_time = 1415463183
        war3_ladder_updatetime = 1415457303
        output_updatetime = 1415463230
#5  0x00000000004bf6e9 in pvpgn::bnetd::server_process () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:249
        laddrs = (t_addrlist *) 0x802bac620
        __FUNCTION__ = "server_process"
#6  0x00000000004b0a15 in main (argc=3, argv=0x7fffffffdaf0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/main.cpp:112
        a = 0
        pidfile = 0x802006180 "/var/run/pvpgn/bnetd.pid"
        __FUNCTION__ = "main"
(gdb)

Добавлено: 08.11.2014 20:29

Собрал pvpgn-199.r577, его еще пилить и пилить похоже: команды типа /con и /games он пишет что не знает...

Зато подумалось, поправляя указатели для исправления ошибок компилятора:
А какая у вас разрядность ОС, у тех у кого стабильно все работает? Может, оно писалось под 32, и где-нибудь память под 32 резервировалась? А у меня он 64...

Добавлено: 09.11.2014 02:26

Для борьбы с утечками памяти, поставил себе valgrind, запустил на новом pvpgn 1.9.9. и на старом 1.9.9
Результаты такие:
Новый:
Ничего не делал, просто запустил:

# valgrind ./bnetd -c /usr/local/pvpgn-1.9.9/etc/bnetd1.conf -f
==54456== Memcheck, a memory error detector
==54456== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==54456== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==54456== Command: ./bnetd -c /usr/local/pvpgn-1.9.9/etc/bnetd1.conf -f
==54456==
You are currently Running PvPGN 1.99.7-PRO
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
If you need support:
 * READ the documentation at http://pvpgndocs.berlios.de/
 * you can subscribe to the pvpgn-users mailing list at
   https://lists.berlios.de/mailman/listinfo/pvpgn-users
 * check out the forums at http://forums.pvpgn.org
 * visit us on IRC on irc.pvpgn.org channel #pvpgn

Server is now running.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
==54456== Invalid read of size 1
==54456==    at 0x4EC922: pvpgn::tag_str_to_uint(char const*) (tag.cpp:145)
==54456==    by 0x4EC564: pvpgn::clienttag_str_to_uint(char const*) (tag.cpp:45)
==54456==    by 0x411161: pvpgn::bnetd::AdBannerComponent::insert(std::map<std::pair<unsigned int, unsigned int>, std::map<unsigned int, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> > > > >, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<std::pair<unsigned int, unsigned int> const, std::map<unsigned int, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> > > > > > > >&, std::string const&, unsigned int, unsigned int, std::string const&, unsigned int, std::string const&, std::string const&) (adbanner.cpp:218)
==54456==    by 0x412755: pvpgn::bnetd::AdBannerComponent::AdBannerComponent(std::string const&) (adbanner.cpp:358)
==54456==    by 0x4B037C: pre_server_startup() (main.cpp:355)
==54456==    by 0x4B0A06: main (main.cpp:538)
==54456==  Address 0x34015ab is 0 bytes after a block of size 27 alloc'd
==54456==    at 0x1208603: operator new(unsigned long) (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x195DF98: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (new_allocator.h:94)
==54456==    by 0x195ECC7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (basic_string.tcc:631)
==54456==    by 0x195EDBF: std::string::reserve(unsigned long) (basic_string.tcc:512)
==54456==    by 0x195F074: std::string::append(char const*, unsigned long) (basic_string.tcc:310)
==54456==    by 0x1917717: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (istream.cc:319)
==54456==    by 0x411C31: pvpgn::bnetd::AdBannerComponent::AdBannerComponent(std::string const&) (adbanner.cpp:307)
==54456==    by 0x4B037C: pre_server_startup() (main.cpp:355)
==54456==    by 0x4B0A06: main (main.cpp:538)
==54456==
==54456== Invalid read of size 1
==54456==    at 0x4EC922: pvpgn::tag_str_to_uint(char const*) (tag.cpp:145)
==54456==    by 0x4EC564: pvpgn::clienttag_str_to_uint(char const*) (tag.cpp:45)
==54456==    by 0x411161: pvpgn::bnetd::AdBannerComponent::insert(std::map<std::pair<unsigned int, unsigned int>, std::map<unsigned int, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> > > > >, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<std::pair<unsigned int, unsigned int> const, std::map<unsigned int, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> > > > > > > >&, std::string const&, unsigned int, unsigned int, std::string const&, unsigned int, std::string const&, std::string const&) (adbanner.cpp:218)
==54456==    by 0x41294A: pvpgn::bnetd::AdBannerComponent::AdBannerComponent(std::string const&) (adbanner.cpp:362)
==54456==    by 0x4B037C: pre_server_startup() (main.cpp:355)
==54456==    by 0x4B0A06: main (main.cpp:538)
==54456==  Address 0x34015ab is 0 bytes after a block of size 27 alloc'd
==54456==    at 0x1208603: operator new(unsigned long) (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x195DF98: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (new_allocator.h:94)
==54456==    by 0x195ECC7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (basic_string.tcc:631)
==54456==    by 0x195EDBF: std::string::reserve(unsigned long) (basic_string.tcc:512)
==54456==    by 0x195F074: std::string::append(char const*, unsigned long) (basic_string.tcc:310)
==54456==    by 0x1917717: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (istream.cc:319)
==54456==    by 0x411C31: pvpgn::bnetd::AdBannerComponent::AdBannerComponent(std::string const&) (adbanner.cpp:307)
==54456==    by 0x4B037C: pre_server_startup() (main.cpp:355)
==54456==    by 0x4B0A06: main (main.cpp:538)
==54456==
==54456== Invalid read of size 1
==54456==    at 0x4EC922: pvpgn::tag_str_to_uint(char const*) (tag.cpp:145)
==54456==    by 0x4EC564: pvpgn::clienttag_str_to_uint(char const*) (tag.cpp:45)
==54456==    by 0x411161: pvpgn::bnetd::AdBannerComponent::insert(std::map<std::pair<unsigned int, unsigned int>, std::map<unsigned int, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> > > > >, std::less<std::pair<unsigned int, unsigned int> >, std::allocator<std::pair<std::pair<unsigned int, unsigned int> const, std::map<unsigned int, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> >, std::less<unsigned int>, std::allocator<std::pair<unsigned int const, std::_Rb_tree_const_iterator<std::pair<unsigned int const, pvpgn::bnetd::AdBanner> > > > > > > >&, std::string const&, unsigned int, unsigned int, std::string const&, unsigned int, std::string const&, std::string const&) (adbanner.cpp:218)
==54456==    by 0x412B86: pvpgn::bnetd::AdBannerComponent::AdBannerComponent(std::string const&) (adbanner.cpp:366)
==54456==    by 0x4B037C: pre_server_startup() (main.cpp:355)
==54456==    by 0x4B0A06: main (main.cpp:538)
==54456==  Address 0x3401e8b is 0 bytes after a block of size 27 alloc'd
==54456==    at 0x1208603: operator new(unsigned long) (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x195DF98: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (new_allocator.h:94)
==54456==    by 0x195ECC7: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (basic_string.tcc:631)
==54456==    by 0x195EDBF: std::string::reserve(unsigned long) (basic_string.tcc:512)
==54456==    by 0x195F074: std::string::append(char const*, unsigned long) (basic_string.tcc:310)
==54456==    by 0x1917717: std::basic_istream<char, std::char_traits<char> >& std::operator>><char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) (istream.cc:319)
==54456==    by 0x411C31: pvpgn::bnetd::AdBannerComponent::AdBannerComponent(std::string const&) (adbanner.cpp:307)
==54456==    by 0x4B037C: pre_server_startup() (main.cpp:355)
==54456==    by 0x4B0A06: main (main.cpp:538)
==54456==

Зашел в систему, все чисто.
Набрал /con:

==54456== Invalid read of size 1
==54456==    at 0x2106950: strnlen (in /lib/libc.so.7)
==54456==    by 0x21001B8: ??? (in /lib/libc.so.7)
==54456==    by 0x20FB5BC: snprintf (in /lib/libc.so.7)
==54456==    by 0x4498E1: pvpgn::bnetd::_handle_connections_command(pvpgn::bnetd::connection*, char const*) (command.cpp:3323)
==54456==    by 0x438928: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==    by 0x4BF6E8: pvpgn::bnetd::server_process() (server.cpp:1654)
==54456==  Address 0x3d88078 is 24 bytes inside a block of size 29 free'd
==54456==    at 0x1209698: operator delete(void*) (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x195E0EF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (basic_string.h:535)
==54456==    by 0x44984E: pvpgn::bnetd::_handle_connections_command(pvpgn::bnetd::connection*, char const*) (command.cpp:3314)
==54456==    by 0x438928: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==    by 0x4BF6E8: pvpgn::bnetd::server_process() (server.cpp:1654)
==54456==    by 0x4B0A14: main (main.cpp:542)
==54456==
==54456== Invalid read of size 2
==54456==    at 0x120C06C: memcpy (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x210CBAC: ??? (in /lib/libc.so.7)
==54456==    by 0x2101134: ??? (in /lib/libc.so.7)
==54456==    by 0x20FB5BC: snprintf (in /lib/libc.so.7)
==54456==    by 0x4498E1: pvpgn::bnetd::_handle_connections_command(pvpgn::bnetd::connection*, char const*) (command.cpp:3323)
==54456==    by 0x438928: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==  Address 0x3d88078 is 24 bytes inside a block of size 29 free'd
==54456==    at 0x1209698: operator delete(void*) (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x195E0EF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (basic_string.h:535)
==54456==    by 0x44984E: pvpgn::bnetd::_handle_connections_command(pvpgn::bnetd::connection*, char const*) (command.cpp:3314)
==54456==    by 0x438928: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==    by 0x4BF6E8: pvpgn::bnetd::server_process() (server.cpp:1654)
==54456==    by 0x4B0A14: main (main.cpp:542)
==54456==
==54456== Invalid read of size 2
==54456==    at 0x120C082: memcpy (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x210CBAC: ??? (in /lib/libc.so.7)
==54456==    by 0x2101134: ??? (in /lib/libc.so.7)
==54456==    by 0x20FB5BC: snprintf (in /lib/libc.so.7)
==54456==    by 0x4498E1: pvpgn::bnetd::_handle_connections_command(pvpgn::bnetd::connection*, char const*) (command.cpp:3323)
==54456==    by 0x438928: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==  Address 0x3d8807a is 26 bytes inside a block of size 29 free'd
==54456==    at 0x1209698: operator delete(void*) (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x195E0EF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (basic_string.h:535)
==54456==    by 0x44984E: pvpgn::bnetd::_handle_connections_command(pvpgn::bnetd::connection*, char const*) (command.cpp:3314)
==54456==    by 0x438928: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==    by 0x4BF6E8: pvpgn::bnetd::server_process() (server.cpp:1654)
==54456==    by 0x4B0A14: main (main.cpp:542)
==54456==
==54456== Invalid write of size 4
==54456==    at 0x4DC6B0: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:262)
==54456==    by 0x4DC1C4: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==54456==    by 0x43895B: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==    by 0x4BF6E8: pvpgn::bnetd::server_process() (server.cpp:1654)
==54456==    by 0x4B0A14: main (main.cpp:542)
==54456==  Address 0x474fd7f is 47 bytes inside a block of size 48 alloc'd
==54456==    at 0x12082B3: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x4EFE77: pvpgn::xmalloc_real(unsigned long, char const*, unsigned int) (xalloc.cpp:38)
==54456==    by 0x4EF979: pvpgn::buildpath(char const*, char const*) (util.cpp:582)
==54456==    by 0x4DC677: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:261)
==54456==    by 0x4DC1C4: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==54456==    by 0x43895B: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==
==54456== Invalid write of size 1
==54456==    at 0x4DC6B6: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:262)
==54456==    by 0x4DC1C4: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==54456==    by 0x43895B: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==    by 0x4BF6E8: pvpgn::bnetd::server_process() (server.cpp:1654)
==54456==    by 0x4B0A14: main (main.cpp:542)
==54456==  Address 0x474fd83 is 3 bytes after a block of size 48 alloc'd
==54456==    at 0x12082B3: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x4EFE77: pvpgn::xmalloc_real(unsigned long, char const*, unsigned int) (xalloc.cpp:38)
==54456==    by 0x4EF979: pvpgn::buildpath(char const*, char const*) (util.cpp:582)
==54456==    by 0x4DC677: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:261)
==54456==    by 0x4DC1C4: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==54456==    by 0x43895B: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==
==54456== Syscall param open(filename) points to unaddressable byte(s)
==54456==    at 0x210692A: open (in /lib/libc.so.7)
==54456==    by 0x20F3732: fopen (in /lib/libc.so.7)
==54456==    by 0x4DC1D9: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:143)
==54456==    by 0x43895B: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==    by 0x4BF6E8: pvpgn::bnetd::server_process() (server.cpp:1654)
==54456==    by 0x4B0A14: main (main.cpp:542)
==54456==  Address 0x474fd80 is 0 bytes after a block of size 48 alloc'd
==54456==    at 0x12082B3: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==54456==    by 0x4EFE77: pvpgn::xmalloc_real(unsigned long, char const*, unsigned int) (xalloc.cpp:38)
==54456==    by 0x4EF979: pvpgn::buildpath(char const*, char const*) (util.cpp:582)
==54456==    by 0x4DC677: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:261)
==54456==    by 0x4DC1C4: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==54456==    by 0x43895B: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==54456==    by 0x487082: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==54456==    by 0x4BCFB3: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==54456==    by 0x4BD728: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==54456==    by 0x4E5227: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==54456==    by 0x4E3B37: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==54456==    by 0x4BF132: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==54456==

Завершил работу сервера:

^C==54456==
==54456== HEAP SUMMARY:
==54456==     in use at exit: 261,015 bytes in 16,001 blocks
==54456==   total heap usage: 1,243,229 allocs, 1,227,228 frees, 251,725,929 bytes allocated
==54456==
==54456== LEAK SUMMARY:
==54456==    definitely lost: 151,637 bytes in 14,281 blocks
==54456==    indirectly lost: 20,697 bytes in 1,490 blocks
==54456==      possibly lost: 0 bytes in 0 blocks
==54456==    still reachable: 88,681 bytes in 230 blocks
==54456==         suppressed: 0 bytes in 0 blocks
==54456== Rerun with --leak-check=full to see details of leaked memory
==54456==
==54456== For counts of detected and suppressed errors, rerun with: -v
==54456== ERROR SUMMARY: 35 errors from 9 contexts (suppressed: 33 from 5)

Старый:

# valgrind ./bnetd -c /usr/local/pvpgn-1.9.9/etc/bnetd1.conf -f
==54619== Memcheck, a memory error detector
==54619== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.
==54619== Using Valgrind-3.8.1 and LibVEX; rerun with -h for copyright info
==54619== Command: ./bnetd -c /usr/local/pvpgn-1.9.9/etc/bnetd1.conf -f
==54619==
Nov 09 02:15:43 [error] _process_option: option 'scriptdir' unknown
Nov 09 02:15:43 [error] _process_option: option 'userlogdir' unknown
Nov 09 02:15:43 [error] _process_option: option 'i18ndir' unknown
Nov 09 02:15:43 [error] _process_option: option 'customicons_file' unknown
Nov 09 02:15:43 [error] _process_option: option 'localizefile' unknown
Nov 09 02:15:43 [error] _process_option: option 'motdw3file' unknown
Nov 09 02:15:43 [error] _process_option: option 'localize_by_country' unknown
Nov 09 02:15:43 [error] _process_option: option 'userflush_connected' unknown
Nov 09 02:15:43 [error] _process_option: option 'log_commands' unknown
Nov 09 02:15:43 [error] _process_option: option 'log_command_groups' unknown
Nov 09 02:15:43 [error] _process_option: option 'log_command_list' unknown
You are currently Running PvPGN 1.99.0-SVN
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
If you need support:
 * READ the documentation at http://pvpgndocs.berlios.de/
 * you can subscribe to the pvpgn-users mailing list at
   https://lists.berlios.de/mailman/listinfo/pvpgn-users
 * check out the forums at http://forums.pvpgn.org
 * visit us on IRC on irc.pvpgn.org channel #pvpgn

Server is now running.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Зашел в систему - все чисто.
набирал всякие разные команды, так и не смог заставить valgrind выдать хотя бы 1 ошибку.
Правда, команда /con у меня почему-то там неактивна. Не разбирался. Конфиг тот же самый.
Завершил работу сервера:

^C^C^C^C^C^C==54619==
==54619== HEAP SUMMARY:
==54619==     in use at exit: 48,977 bytes in 21 blocks
==54619==   total heap usage: 71,226 allocs, 71,205 frees, 150,418,956 bytes allocated
==54619==
==54619== LEAK SUMMARY:
==54619==    definitely lost: 0 bytes in 0 blocks
==54619==    indirectly lost: 0 bytes in 0 blocks
==54619==      possibly lost: 0 bytes in 0 blocks
==54619==    still reachable: 48,977 bytes in 21 blocks
==54619==         suppressed: 0 bytes in 0 blocks
==54619== Rerun with --leak-check=full to see details of leaked memory
==54619==
==54619== For counts of detected and suppressed errors, rerun with: -v
==54619== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 33 from 5)

Параметры сборки одинаковые.

Надо вылавливать ошибки работы с памятью.

Добавлено: 10.11.2014 01:33

Виноват - был неправ, на старый pvpgn valgrind ругается на тот же:
pvpgn::tag_str_to_uint(char const*) (tag.cpp:145)
как ни исхитрялся, но присваивание "tag_uint |= tag_str[3];" ему не нравится.

Просто эта функция то срабатывает при старте сервера, то нет.

Что по-прежнему актуально, это утечки памяти при запуске нового pvpgn и полное отсутствие утечек в старом. Во всяком случае, на левом порту, который пока не придумал как протестировать кроме телнета.

А вот зато сейчас пересобрал pvpgn с помощью clang, и эта ошибка пропала!
Зато обнаружил другие две:

==81148== Invalid write of size 1
==81148==    at 0x1267E40: strcat (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==81148==    by 0x58255B: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:262)
==81148==    by 0x5819AD: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==81148==    by 0x46E905: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==81148==    by 0x4EF0F8: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==81148==    by 0x54DA90: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==81148==    by 0x54D254: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==81148==    by 0x593AF7: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==81148==    by 0x592064: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==81148==    by 0x54C27A: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==81148==    by 0x54A205: pvpgn::bnetd::server_process() (server.cpp:1654)
==81148==    by 0x53A021: main (main.cpp:542)
==81148==  Address 0x5ab441a is 0 bytes after a block of size 42 alloc'd
==81148==    at 0x12652B3: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==81148==    by 0x5A3ECB: pvpgn::xmalloc_real(unsigned long, char const*, unsigned int) (xalloc.cpp:38)
==81148==    by 0x5A387B: pvpgn::buildpath(char const*, char const*) (util.cpp:582)
==81148==    by 0x582534: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:261)
==81148==    by 0x5819AD: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==81148==    by 0x46E905: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==81148==    by 0x4EF0F8: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==81148==    by 0x54DA90: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==81148==    by 0x54D254: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==81148==    by 0x593AF7: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==81148==    by 0x592064: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==81148==    by 0x54C27A: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==81148==
==81148== Invalid write of size 1
==81148==    at 0x1267E4C: strcat (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==81148==    by 0x58255B: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:262)
==81148==    by 0x5819AD: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==81148==    by 0x46E905: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==81148==    by 0x4EF0F8: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==81148==    by 0x54DA90: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==81148==    by 0x54D254: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==81148==    by 0x593AF7: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==81148==    by 0x592064: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==81148==    by 0x54C27A: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==81148==    by 0x54A205: pvpgn::bnetd::server_process() (server.cpp:1654)
==81148==    by 0x53A021: main (main.cpp:542)
==81148==  Address 0x5ab441b is 1 bytes after a block of size 42 alloc'd
==81148==    at 0x12652B3: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==81148==    by 0x5A3ECB: pvpgn::xmalloc_real(unsigned long, char const*, unsigned int) (xalloc.cpp:38)
==81148==    by 0x5A387B: pvpgn::buildpath(char const*, char const*) (util.cpp:582)
==81148==    by 0x582534: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:261)
==81148==    by 0x5819AD: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==81148==    by 0x46E905: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==81148==    by 0x4EF0F8: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==81148==    by 0x54DA90: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==81148==    by 0x54D254: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==81148==    by 0x593AF7: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==81148==    by 0x592064: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==81148==    by 0x54C27A: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==81148==
==81148== Invalid write of size 1
==81148==    at 0x1267E59: strcat (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==81148==    by 0x58255B: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:262)
==81148==    by 0x5819AD: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==81148==    by 0x46E905: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==81148==    by 0x4EF0F8: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==81148==    by 0x54DA90: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==81148==    by 0x54D254: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==81148==    by 0x593AF7: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==81148==    by 0x592064: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==81148==    by 0x54C27A: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==81148==    by 0x54A205: pvpgn::bnetd::server_process() (server.cpp:1654)
==81148==    by 0x53A021: main (main.cpp:542)
==81148==  Address 0x5ab441d is 3 bytes after a block of size 42 alloc'd
==81148==    at 0x12652B3: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==81148==    by 0x5A3ECB: pvpgn::xmalloc_real(unsigned long, char const*, unsigned int) (xalloc.cpp:38)
==81148==    by 0x5A387B: pvpgn::buildpath(char const*, char const*) (util.cpp:582)
==81148==    by 0x582534: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:261)
==81148==    by 0x5819AD: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==81148==    by 0x46E905: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==81148==    by 0x4EF0F8: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==81148==    by 0x54DA90: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==81148==    by 0x54D254: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==81148==    by 0x593AF7: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==81148==    by 0x592064: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==81148==    by 0x54C27A: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==81148==
==81148== Syscall param open(filename) points to unaddressable byte(s)
==81148==    at 0x233192A: open (in /lib/libc.so.7)
==81148==    by 0x231E732: fopen (in /lib/libc.so.7)
==81148==    by 0x5819C8: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:143)
==81148==    by 0x46E905: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==81148==    by 0x4EF0F8: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==81148==    by 0x54DA90: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==81148==    by 0x54D254: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==81148==    by 0x593AF7: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==81148==    by 0x592064: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==81148==    by 0x54C27A: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==81148==    by 0x54A205: pvpgn::bnetd::server_process() (server.cpp:1654)
==81148==    by 0x53A021: main (main.cpp:542)
==81148==  Address 0x5ab441a is 0 bytes after a block of size 42 alloc'd
==81148==    at 0x12652B3: malloc (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==81148==    by 0x5A3ECB: pvpgn::xmalloc_real(unsigned long, char const*, unsigned int) (xalloc.cpp:38)
==81148==    by 0x5A387B: pvpgn::buildpath(char const*, char const*) (util.cpp:582)
==81148==    by 0x582534: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:261)
==81148==    by 0x5819AD: pvpgn::bnetd::userlog_append(pvpgn::bnetd::account_struct*, char const*) (userlog.cpp:141)
==81148==    by 0x46E905: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:609)
==81148==    by 0x4EF0F8: pvpgn::bnetd::handle_telnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_telnet.cpp:340)
==81148==    by 0x54DA90: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:690)
==81148==    by 0x54D254: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==81148==    by 0x593AF7: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==81148==    by 0x592064: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==81148==    by 0x54C27A: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)
==81148==

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

Ну и это конечно после исправления ошибки с
#0  0x00000000004d4ace in pvpgn::bnetd::Watch::getOwner (this=0x800676f7c) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/watch.cpp:50

И с моим рефакторнутым attrgroup.cpp. Во всяком случае, после его переделки он работал в последний раз потора часа и упал на getOwner. Что дает надежду на результативность моего рефакторинга...

28

Re: core dump. Сервер падает под freebsd 10

iltmpz wrote:

И с моим рефакторнутым attrgroup.cpp. Во всяком случае, после его переделки он работал в последний раз потора часа и упал на getOwner. Что дает надежду на результативность моего рефакторинга...

Уже некоторое время читаю эту ветку, и до сих пор не могу понять твою проблему.
У тебя 1.99 версия падает тоже? У тебя случаем нету какой то части русификации, там ников, игры - каких либо изменений? Если падает на френдах - что ты менял в отличии от 1.99 ?
Или вся суть проблемы внедрения новых скриптов LUA?

29

Re: core dump. Сервер падает под freebsd 10

Именно 1.99 и падает, которая с github'а. Старую 1.99 не пробовал пока в продакшене.
Русификация у меня та что из комплекта: файлы i18n. И да, север выдает приветствие по-русски и на других языках.

По поводу ников - у меня разрешены имена: account_allowed_symbols = ".-_[]()~!@#$%^*:{}`"
вместо дефолтового default setting is "-_[]"

И да, юзеры активно пользуются этими ".-_[]()~!@#$%^*:{}`", там что отключить просто так не получится.

Но падает вроде бы не на этом месте, ну или не только на этом.


LUA я отключил ближе к началу топика (cmake -D WITH_LUA=false).

В отличие от 1.99 я скачал самую последнюю свежую 1.9.9 от HarpyWar со всеми коммитами. Едиснтвенное, что поменял - это файл attrgroup.cpp, и то только после того, как словил штук 7 падений подряд на участках, завязаввых на функции этого файла.
Что может сильно отличаться от оригинальной 1.99 - это база игроков, в которой после чистки осталось порядка 42 тыс записей. Соотв, в таблице friends у многих остались ссылки на удаленных друзей. База была наработала в течение лет работы прошлого сервера 1.8.5, обнулять ее ну очень не хочется.

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

30

Re: core dump. Сервер падает под freebsd 10

iltmpz wrote:

Что может сильно отличаться от оригинальной 1.99 - это база игроков, в которой после чистки осталось порядка 42 тыс записей. Соотв, в таблице friends у многих остались ссылки на удаленных друзей. База была наработала в течение лет работы прошлого сервера 1.8.5, обнулять ее ну очень не хочется.
планируется использовать...

Тогда давай попробуй так - сохрани всю таблицу friend, потом полностью очисть - погоняй сервак 2-3 дня, если юзеры начнут ныть что пропали френды - то потом восстановишь и напишешь скрипт о очистке.

31

Re: core dump. Сервер падает под freebsd 10

kucc wrote:

Тогда давай попробуй так - сохрани всю таблицу friend, потом полностью очисть - погоняй сервак 2-3 дня, если юзеры начнут ныть что пропали френды - то потом восстановишь и напишешь скрипт о очистке.

В принципе, вариант, но из 10-ка падений, на френдах было только 2 или 3 раза.

В частности, последнее падение было в вообще другом месте, которое соответственно надо исправить.
Ну и при каждом новом падении я в общем-то вижу примерную точку этого падения, и пока она не исправлена - запускать сервер в следующий раз - не хочется.

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

32

Re: core dump. Сервер падает под freebsd 10

iltmpz wrote:
kucc wrote:

Тогда давай попробуй так - сохрани всю таблицу friend, потом полностью очисть - погоняй сервак 2-3 дня, если юзеры начнут ныть что пропали френды - то потом восстановишь и напишешь скрипт о очистке.

В принципе, вариант, но из 10-ка падений, на френдах было только 2 или 3 раза.

В частности, последнее падение было в вообще другом месте, которое соответственно надо исправить.
Ну и при каждом новом падении я в общем-то вижу примерную точку этого падения, и пока она не исправлена - запускать сервер в следующий раз - не хочется.

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

Если честно помню когда переносил и чистил базу тупым удаление юзеря в одном лишь месте, то при загрузке сервера - он выдавал что не существует такого френда под таким ай ди и усе, потом ручками почистил и было усе ок.
Ну я не юзаю общий коммит, у меня 1.8.5 перенесены некоторые вещи на 1.99 и дальше допилен ручками - в итоге аптайм бывает до 6-ти месяцев при онлайне 400+

33

Re: core dump. Сервер падает под freebsd 10

kucc wrote:

Если честно помню когда переносил и чистил базу тупым удаление юзеря в одном лишь месте, то при загрузке сервера - он выдавал что не существует такого френда под таким ай ди и усе, потом ручками почистил и было усе ок.
Ну я не юзаю общий коммит, у меня 1.8.5 перенесены некоторые вещи на 1.99 и дальше допилен ручками - в итоге аптайм бывает до 6-ти месяцев при онлайне 400+

У меня про битых френдов в логе ничего не пишет...
А 1.99 оригинальная? которая pvpgn-199.r577?
Да я подумал, почитал про коммиты, понял, что минимум половину этого хочу, плюс здорово, что у него активный девелопер, ну и решил обновляться на нее.
Ну а портировать свои наработки мне проще, добавив пару веток с своему форку.
Да и то, пока все мои наработки уже реазизованы в последней версии от HarpyWar.

kucc, а у тебя на какой ОС все так работает?

34

Re: core dump. Сервер падает под freebsd 10

iltmpz wrote:

У меня про битых френдов в логе ничего не пишет...
А 1.99 оригинальная? которая pvpgn-199.r577?

kucc, а у тебя на какой ОС все так работает?

Странно должно было, на сколько я помню.
Windows 2003 smile Собран на Visual Studio 2008 SP2

35

Re: core dump. Сервер падает под freebsd 10

kucc wrote:
iltmpz wrote:

У меня про битых френдов в логе ничего не пишет...
А 1.99 оригинальная? которая pvpgn-199.r577?

kucc, а у тебя на какой ОС все так работает?

Странно должно было, на сколько я помню.
Windows 2003 smile Собран на Visual Studio 2008 SP2

Может, под VS компилятор по-другому ошибки ловит? Дополнительные проверки какие-нибудь, которые утечки устраняют...
Пересоберу под clang, попробую, он вроде поновее, и более требовательный, может, и ошибки лучше обрабатывает?..

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

Про френдов еще раз перепроверил все логи:  #grep friend /var/log/pvpgn/bnetd.log | grep -v SELECT | grep -v 'friends about' | less
- ни одной ошибки, мол юзер не существует - ни одной строки не выдал...

36

Re: core dump. Сервер падает под freebsd 10

iltmpz wrote:

Про френдов еще раз перепроверил все логи:  #grep friend /var/log/pvpgn/bnetd.log | grep -v SELECT | grep -v 'friends about' | less
- ни одной ошибки, мол юзер не существует - ни одной строки не выдал...


Попробуй на grep -v ' uid '

37

Re: core dump. Сервер падает под freebsd 10

kucc wrote:

Попробуй на grep -v ' uid '

Огромная куча мусора в логах, на френдов ничего похожего.
Примерно такой запрос отфильтровал, чтобы отсеять явно лишнее:
# grep ' uid' /var/log/pvpgn/bnetd.log | grep -v 'sql_read_attrs: SELECT' | grep -v 'sql_create_account: ' | grep -v ' sql_read_account: SELECT uid FROM BNET WHERE' | grep -v 'sql_write_attrs: multi-update query:' | grep -v 'sql_load_clans: added member' | grep -v 'db_set: UPDATE BNET SET' | grep -v 'db_set: UPDATE'

38

Re: core dump. Сервер падает под freebsd 10

iltmpz wrote:
kucc wrote:

Попробуй на grep -v ' uid '

Огромная куча мусора в логах, на френдов ничего похожего.
Примерно такой запрос отфильтровал, чтобы отсеять явно лишнее:
# grep ' uid' /var/log/pvpgn/bnetd.log | grep -v 'sql_read_attrs: SELECT' | grep -v 'sql_create_account: ' | grep -v ' sql_read_account: SELECT uid FROM BNET WHERE' | grep -v 'sql_write_attrs: multi-update query:' | grep -v 'sql_load_clans: added member' | grep -v 'db_set: UPDATE BNET SET' | grep -v 'db_set: UPDATE'

Если при ' uid ' куча мусора - то это жесть smile Там не будет ошибки что именно friend а просто будет not uid или got NULL uid from db.
Выложил бы свой лог целиком, самим легче посмотреть что там.

39 (edited by iltmpz 20.11.2014 13:41)

Re: core dump. Сервер падает под freebsd 10

kucc wrote:
iltmpz wrote:
kucc wrote:

Попробуй на grep -v ' uid '

Огромная куча мусора в логах, на френдов ничего похожего.
Примерно такой запрос отфильтровал, чтобы отсеять явно лишнее:
# grep ' uid' /var/log/pvpgn/bnetd.log | grep -v 'sql_read_attrs: SELECT' | grep -v 'sql_create_account: ' | grep -v ' sql_read_account: SELECT uid FROM BNET WHERE' | grep -v 'sql_write_attrs: multi-update query:' | grep -v 'sql_load_clans: added member' | grep -v 'db_set: UPDATE BNET SET' | grep -v 'db_set: UPDATE'

Если при ' uid ' куча мусора - то это жесть smile Там не будет ошибки что именно friend а просто будет not uid или got NULL uid from db.
Выложил бы свой лог целиком, самим легче посмотреть что там.

Ну у меня логлевел в trace выставлен, так что да, куча мусора это нормально

Добавлено: 18.11.2014 17:38

Ну вот, HarpyWar пропал куда-то, и форум заглох...

Поставил я pvpgn-199.r577, подцепил ту же свою базу, задал аналогичные настройки, и пока все работает и не падает уже сутки.
Новый pvpgn работал от 30 секунд до 4 часов, после чего падал. Причем точку падения по стеку вызовов обнаружить ни разу не удалось.

Добавлено: 19.11.2014 21:52

Так, перемещением по коммитам, удалось найти утечку памяти:
Как только я дохожу до этого коммита:
allows any symbols in sql field (not only letters and numerics)
HarpyWar authored on 24 Jan
commit 18713ffe35cbe9a12193e5c1f1caf5031d4c4731

- так сразу получаю memory leak по данным valgrind:

==79982== LEAK SUMMARY:
==79982==    definitely lost: 188,795 bytes in 9,673 blocks
==79982==    indirectly lost: 0 bytes in 0 blocks
==79982==      possibly lost: 0 bytes in 0 blocks
==79982==    still reachable: 48,914 bytes in 18 blocks
==79982==         suppressed: 0 bytes in 0 blocks
==79982==
==79982== For counts of detected and suppressed errors, rerun with: -v
==79982== ERROR SUMMARY: 54 errors from 54 contexts (suppressed: 33 from 5)

На предыдущем коммите утечки нет:

==78433== HEAP SUMMARY:
==78433==     in use at exit: 48,914 bytes in 18 blocks
==78433==   total heap usage: 154,045 allocs, 154,027 frees, 326,444,099 bytes allocated
==78433==
==78433== LEAK SUMMARY:
==78433==    definitely lost: 0 bytes in 0 blocks
==78433==    indirectly lost: 0 bytes in 0 blocks
==78433==      possibly lost: 0 bytes in 0 blocks
==78433==    still reachable: 48,914 bytes in 18 blocks
==78433==         suppressed: 0 bytes in 0 blocks

Абсолютно не уверен, что утечка связана с моими падениями, но больше пока мыслей относительно поиска ошибки - нет. В любом случае - утечка памяти это ошибка, которую необходимо устранять.

Добавлено: 20.11.2014 12:24

Заменил файл src/bnetd/storage_sql.cpp старым, пытаюсь запустить более-менее новую версию со старым этим файлом.
Дошел до коммита, который собрался на freebsd, src/bnetd/storage_sql.cpp оставил старый:

commit 11fc7760a05d1a48cc60b506960c429cd944e78e
Author: HarpyWar <harpywar@gmail.com>
Date:   Tue May 27 14:12:12 2014 +0400

    * send notification message to user after /rehash
    * move command_split() into command.cpp
    * fix compile errors on linux

Запустил сервер, зашел на него, набрал команду /games, сервер упал:

# gdb pvpgn-1.9.9/sbin/bnetd vgcore.9242
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "amd64-marcel-freebsd"...
Core was generated by `bnetd'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /usr/local/lib/valgrind/vgpreload_core-amd64-freebsd.so...done.
Loaded symbols for /usr/local/lib/valgrind/vgpreload_core-amd64-freebsd.so
Reading symbols from /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so...done.
Loaded symbols for /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so
Reading symbols from /lib/libz.so.6...done.
Loaded symbols for /lib/libz.so.6
Reading symbols from /usr/local/lib/mysql/libmysqlclient.so.16...done.
Loaded symbols for /usr/local/lib/mysql/libmysqlclient.so.16
Reading symbols from /usr/local/lib/gcc47/libstdc++.so.6...done.
Loaded symbols for /usr/local/lib/gcc47/libstdc++.so.6
Reading symbols from /lib/libm.so.5...done.
Loaded symbols for /lib/libm.so.5
Reading symbols from /lib/libgcc_s.so.1...done.
Loaded symbols for /lib/libgcc_s.so.1
Reading symbols from /lib/libc.so.7...done.
Loaded symbols for /lib/libc.so.7
Reading symbols from /lib/libcrypt.so.5...done.
Loaded symbols for /lib/libcrypt.so.5
Reading symbols from /libexec/ld-elf.so.1...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x00000000020a812d in fseek () from /lib/libc.so.7
(gdb) bt full
#0  0x00000000020a812d in fseek () from /lib/libc.so.7
No symbol table info available.
#1  0x00000000020a804c in rewind () from /lib/libc.so.7
No symbol table info available.
#2  0x00000000004901a4 in pvpgn::bnetd::describe_command (c=0x403f590, cmd=0x2fa9398 "games") at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/helpfile.cpp:87
        line = 0x7ff00062c "Ъ"
        i = 0
#3  0x00000000004413c7 in _handle_games_command (c=0x403f590, text=0x3a7a6f4 "/games") at xstr.h:64
        clienttag_str = "Тії\003"
        dest = 0x7a703f70930 <Address 0x7a703f70930 out of bounds>
        difficulty = 0x4fad38 "/root/pvpgn/HarpyWar/pvpgn/src/bnetd/account_wrap.cpp"
        cbdata = {diff = 5223999, tag = 0, c = 0x348cbd0, lobby = 4}
        args = {<std::_Vector_base<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >> = {
    _M_impl = {<std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >> = {<__gnu_cxx::new_allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >> = {<No data fields>}, <No data fields>}, _M_start = 0x2ea0310, _M_finish = 0x2ea0328,
      _M_end_of_storage = 0x2ea0328}}, <No data fields>}
#4  0x0000000000437c0a in pvpgn::bnetd::handle_command (c=0x403f590, text=0x3a7a6f4 "/games") at xstr.h:64
        p = (const t_command_table_row *) 0x5141b0
        __FUNCTION__ = "handle_command"
#5  0x0000000000473e40 in _client_message (c=0x403f590, packet=0x3a7a6e0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:334
        text = 0x3a7a6f4 "/games"
        channel = (const t_channel *) 0x2dcaab0
        __FUNCTION__ = "_client_message"
#6  0x0000000000467b1e in handle (htable=0x5299a0, type=3839, c=0x403f590, packet=0x3a7a6e0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:338
        p = (const N5pvpgn5bnetd12t_htable_rowE *) 0x529b50
        res = 0
#7  0x0000000000467964 in pvpgn::bnetd::handle_bnet_packet (c=0x403f590, packet=0x3a7a6e0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/handle_bnet.cpp:308
        __FUNCTION__ = "handle_bnet_packet"
#8  0x00000000004c1a55 in sd_tcpinput (c=0x403f590) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:248
        ret = 0
        packet = (t_packet *) 0x3a7a6e0
        __FUNCTION__ = "sd_tcpinput"
        currsize = 11
        csocket = 10
        skip = false
#9  0x00000000004c2354 in handle_tcp (data=0x403f590, rw=pvpgn::fdwatch_type_read) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:248
No locals.
#10 0x00000000004e4505 in pvpgn::FDWKqueueBackend::handle (this=0x2d91e60) at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch_kqueue.cpp:42
        cfd = (pvpgn::t_fdwatch_fd *) 0x2d805b0
        i = 0
#11 0x00000000004e29c7 in pvpgn::fdwatch_handle () at /root/pvpgn/HarpyWar/pvpgn/src/common/fdwatch.cpp:58
No locals.
#12 0x00000000004c3e6d in _server_mainloop (laddrs=0x40243e0) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:248
        prev_time = 1416471844
        __FUNCTION__ = "_server_mainloop"
        next_savetime = 1416471867
        track_time = 1416471807
        war3_ladder_updatetime = 1416471807
        output_updatetime = 1416471837
#13 0x00000000004c4479 in pvpgn::bnetd::server_process () at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/server.cpp:248
        laddrs = (t_addrlist *) 0x40243e0
        __FUNCTION__ = "server_process"
#14 0x00000000004b09a3 in main (argc=4, argv=0x7ff000b88) at /root/pvpgn/HarpyWar/pvpgn/src/bnetd/main.cpp:110
        a = 0
        pidfile = 0x2c31130 "/var/run/pvpgn/bnetd1.pid"
---Type <return> to continue, or q <return> to quit---
        __FUNCTION__ = "main"
(gdb)

В первый раз пожалуй упал на внятном месте, а значит, это надо использовать.
Допускаю, что файлы проекта у меня были неверны (хотя make install все расставил сам).
Может быть, ошибка, приводившая к падению была исправлена позже, а может быть, недостаточная аккуратность проверок может приводить к падениям и сейчас?
Попробовал запустить сервер, войти, выйти и завершить, для выявления ошибок памяти - они есть:

==9876== LEAK SUMMARY:
==9876==    definitely lost: 144 bytes in 9 blocks
==9876==    indirectly lost: 18 bytes in 2 blocks
==9876==      possibly lost: 0 bytes in 0 blocks
==9876==    still reachable: 85,656 bytes in 231 blocks
==9876==         suppressed: 0 bytes in 0 blocks
==9876==
==9876== For counts of detected and suppressed errors, rerun with: -v
==9876== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 33 from 5)

Добавлено: 20.11.2014 16:23

Итак, сервер pvpgn-199.r577, он же - сборка от d1zzy запустился с 1-го раза и проработал чуть больше 3 суток, показав стабильную работу.
Сегодня я его остановил и запустил версию от HarpyWar, откатив его до коммита:

commit c376602982f7fc50ecdb786c0e14583a8baa5e37
Author: HarpyWar <harpywar@gmail.com>
Date:   Mon Apr 7 13:02:38 2014 +0400

    fix compile on posix systems

И дополнительно заменив src/bnetd/storage_sql.cpp на файл из версии d1zzy.
Утечек памяти я в процессе холостых тестов я не обнаружил, посмотрим, как будет работать эта версия в продакшене.

Добавлено: 22.11.2014 16:16

В таком варианте сервер проработал отлично 2 суток, после чего было сделано следующее:
- Взят тот же коммит от 7 апреля: commit c376602982f7fc50ecdb786c0e14583a8baa5e37
- Та же замена src/bnetd/storage_sql.cpp на файл из версии d1zzy
- Дополнительно замена adbanner.cpp и adbanner.h из самой последней версии

Утечек памяти в таком варианте valgrind не нашел, сервер запустился, баннеры отображаются корректно.
Сейчас сервер работает с этими апдейтами, посмотрю, как будет работать дальше...

Хочется конечно обновить функционал до последнего поддерживаемого списка команд, плюс lua - очень вкусная штука, но боюсь, слишком многое на них завязано, чтобы можно это было сделать, не заменив 90% исходников и не получив утечки и падения...

40

Re: core dump. Сервер падает под freebsd 10

По моему, нужно делать дампы на Windows... или же необходимо альтернативу gdb найти, которая бы выдавала точность как в Windows. Текущая точность совсем никуда не годится и практически ничего не дает.
Не особенно понимаю как работает valgrid, и как с помощью него можно отследить место утечки памяти.

В коммите 18713ffe35cbe9a12193e5c1f1caf5031d4c4731, насколько я помню, была изменена только функция sql_escape_key. А утечка памяти там возможно из-за дубликата строки "newkey = xstrdup(key);" (она уже удалена в последних коммитах)?

Do not ask for support in PM.

41 (edited by iltmpz 12.12.2014 02:13)

Re: core dump. Сервер падает под freebsd 10

HarpyWar wrote:

По моему, нужно делать дампы на Windows...

... если на windows эти ошибки вообще всплывут. У всех же вроде работает все?

HarpyWar wrote:

А утечка памяти там возможно из-за дубликата строки "newkey = xstrdup(key);" (она уже удалена в последних коммитах)?

Да, действительно, убрал дубль, утечек памяти нет.

HarpyWar wrote:

Не особенно понимаю как работает valgrid, и как с помощью него можно отследить место утечки памяти.

Погуглил про valgrind и про вообще, возник вопрос (может, туплю, или что-то тут очень сильно не так?)
valgrind пишет:

==44725== Invalid write of size 4
==44725==    at 0x4DC6DE: pvpgn::bnetd::userlog_filename(char const*, bool) (userlog.cpp:262)

Лезу в этот файл, нахожу:

                        filepath = buildpath(filepath, lusername.c_str());
                       [b] std::strcat(filepath, ".log");[/b] // 262-я строка

А вот он - buildpath:

        extern char * buildpath(char const *root, const char *suffix)
        {
                char *result;

                result = (char*)xmalloc(std::strlen(root) + 1 + std::strlen(suffix) + 1); // выделяется памяти ровно "root/suffix\0"

                std::strcpy(result, root); std::strcat(result, "/"); std::strcat(result, suffix);
                return result;
        }

Честно, strcat никогда в жизни не пользовался, но читаю доку: en.cppreference.com/w/cpp/string/byte/strcat

The destination byte string must have enough space for the contents of both dest and src, plus the terminating null character.

И пример:

#include <cstring>
#include <cstdio>
 
int main() 
{
    char str[50] = "Hello ";
    char str2[50] = "World!";
    std::strcat(str, str2);
    std::strcat(str, " Goodbye World!");
    std::puts(str);
}

Т.е. создать массив подлиннее, чтобы туда все влезло.

Или я совсем туплю, или в нашем коде ".log" пишется заведомо за пределами выделенного массива, при этом ГАРАНТИРОВАННО разрушая данные в памяти? О чем и оповещает valgrind?

Это я все о последней актуальной версии с github, если что

Добавлено: 12.12.2014 00:07

Значит, дальше буду ковырять master с github:

Userlog я переписал - коммит вышлю.

Следующее, что мне удалось увидеть:
При входе на сервер, при попытке 1-й раз набрать /con - получил простыню из ошибок про строку 3323 и 3314:

==52522== Invalid read of size 1
==52522==    at 0x2107950: strnlen (in /lib/libc.so.7)
==52522==    by 0x21011B8: ??? (in /lib/libc.so.7)
==52522==    by 0x20FC5BC: snprintf (in /lib/libc.so.7)
==52522==    by 0x44993F: pvpgn::bnetd::_handle_connections_command(pvpgn::bnetd::connection*, char const*) (command.cpp:3323)
==52522==    by 0x438986: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==52522==    by 0x47A7DB: pvpgn::bnetd::_client_message(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:3591)
==52522==    by 0x46F318: pvpgn::bnetd::handle(pvpgn::bnetd::t_htable_row const*, int, pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:344)
==52522==    by 0x46F17D: pvpgn::bnetd::handle_bnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:314)
==52522==    by 0x4BCFC0: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:681)
==52522==    by 0x4BD786: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==52522==    by 0x4E52D5: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==52522==    by 0x4E3BE5: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==52522==  Address 0x69a91b8 is 24 bytes inside a block of size 29 free'd
==52522==    at 0x120A698: operator delete(void*) (in /usr/local/lib/valgrind/vgpreload_memcheck-amd64-freebsd.so)
==52522==    by 0x195F0EF: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (basic_string.h:535)
==52522==    by 0x4498AC: pvpgn::bnetd::_handle_connections_command(pvpgn::bnetd::connection*, char const*) (command.cpp:3314)
==52522==    by 0x438986: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==52522==    by 0x47A7DB: pvpgn::bnetd::_client_message(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:3591)
==52522==    by 0x46F318: pvpgn::bnetd::handle(pvpgn::bnetd::t_htable_row const*, int, pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:344)
==52522==    by 0x46F17D: pvpgn::bnetd::handle_bnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:314)
==52522==    by 0x4BCFC0: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:681)
==52522==    by 0x4BD786: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==52522==    by 0x4E52D5: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==52522==    by 0x4E3BE5: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==52522==    by 0x4BF190: pvpgn::bnetd::_server_mainloop(pvpgn::list*) (server.cpp:1526)

Это дублируется 3 раза. Надо исправлять, займусь в ближайшее время, хотя в причину ошибки вникнуть не удалось...

Дальше вообще супер - нашел багу:
пустил привилегированную команду /set - он что-то ругнулся на отсутствующий хелп, valgrind выплюнул 1 ошибку, и пвпгн умер:

==52522== Invalid read of size 8
==52522==    at 0x20F412D: ??? (in /lib/libc.so.7)
==52522==    by 0x20F404B: rewind (in /lib/libc.so.7)
==52522==    by 0x4928FB: pvpgn::bnetd::describe_command(pvpgn::bnetd::connection*, char const*) (helpfile.cpp:204)
==52522==    by 0x451871: pvpgn::bnetd::_handle_set_command(pvpgn::bnetd::connection*, char const*) (command.cpp:4623)
==52522==    by 0x438986: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==52522==    by 0x47A7DB: pvpgn::bnetd::_client_message(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:3591)
==52522==    by 0x46F318: pvpgn::bnetd::handle(pvpgn::bnetd::t_htable_row const*, int, pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:344)
==52522==    by 0x46F17D: pvpgn::bnetd::handle_bnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:314)
==52522==    by 0x4BCFC0: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:681)
==52522==    by 0x4BD786: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==52522==    by 0x4E52D5: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==52522==    by 0x4E3BE5: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==52522==  Address 0x48 is not stack'd, malloc'd or (recently) free'd
==52522==
==52522==
==52522== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==52522==  Access not within mapped region at address 0x48
==52522==    at 0x20F412D: ??? (in /lib/libc.so.7)
==52522==    by 0x20F404B: rewind (in /lib/libc.so.7)
==52522==    by 0x4928FB: pvpgn::bnetd::describe_command(pvpgn::bnetd::connection*, char const*) (helpfile.cpp:204)
==52522==    by 0x451871: pvpgn::bnetd::_handle_set_command(pvpgn::bnetd::connection*, char const*) (command.cpp:4623)
==52522==    by 0x438986: pvpgn::bnetd::handle_command(pvpgn::bnetd::connection*, char const*) (command.cpp:603)
==52522==    by 0x47A7DB: pvpgn::bnetd::_client_message(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:3591)
==52522==    by 0x46F318: pvpgn::bnetd::handle(pvpgn::bnetd::t_htable_row const*, int, pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:344)
==52522==    by 0x46F17D: pvpgn::bnetd::handle_bnet_packet(pvpgn::bnetd::connection*, pvpgn::t_packet const*) (handle_bnet.cpp:314)
==52522==    by 0x4BCFC0: pvpgn::bnetd::sd_tcpinput(pvpgn::bnetd::connection*) (server.cpp:681)
==52522==    by 0x4BD786: pvpgn::bnetd::handle_tcp(void*, pvpgn::t_fdwatch_type) (server.cpp:906)
==52522==    by 0x4E52D5: pvpgn::FDWKqueueBackend::handle() (fdwatch_kqueue.cpp:226)
==52522==    by 0x4E3BE5: pvpgn::fdwatch_handle() (fdwatch.cpp:198)
==52522==  If you believe this happened as a result of a stack
==52522==  overflow in your program's main thread (unlikely but
==52522==  possible), you can try to increase the size of the
==52522==  main thread stack using the --main-stacksize= flag.
==52522==  The main thread stack size used in this run was 16777216.
==52522==
==52522== HEAP SUMMARY:
==52522==     in use at exit: 3,284,020 bytes in 26,278 blocks
==52522==   total heap usage: 1,971,664 allocs, 1,945,386 frees, 397,742,765 bytes allocated
==52522==
==52522== LEAK SUMMARY:
==52522==    definitely lost: 18,172 bytes in 4,116 blocks
==52522==    indirectly lost: 0 bytes in 0 blocks
==52522==      possibly lost: 89,632 bytes in 828 blocks
==52522==    still reachable: 3,176,216 bytes in 21,334 blocks
==52522==         suppressed: 0 bytes in 0 blocks
==52522== Rerun with --leak-check=full to see details of leaked memory
==52522==
==52522== For counts of detected and suppressed errors, rerun with: -v
==52522== ERROR SUMMARY: 36 errors from 4 contexts (suppressed: 51 from 7)
Segmentation fault

Добавлено: 12.12.2014 00:50

Собственно, на отсутствующий хелп он ругнулся в лог при входе юзера на сервер:
Dec 12 00:40:27 [error] conn_send_welcome: could not open MOTD file "/usr/local/pvpgn-1.9.9/etc/bnmotd-enUS.txt" for reading (std::fopen: No such file or directory)

В функции describe_command в./bnetd/helpfile.cpp отсутствует проверка после вызова:
std::FILE* hfd = get_hfd(c);

В функции get_hfd, похоже, эта проверка тоже отсутствует.
Интересно, что вернет "return hfd_list[languages[0]];"?

По функции helpfile_init у меня сомнения:
если внутри цикла какой-нибудь из языков не нашелся, она не пытаясь загрузить другие языки возвращает ошибку. После этого работа программы продолжается. При этом уже загруженные ранее языки могут быть нормально использованы. Вряд ли это так и задумывалось, и return -1; - там лишний.
Также, нормальное продолжение работы после того, как ни один язык не был загружен, приводит к падению сервера.

Также очень не понравилось отсутствие проверок значения lang в функции conn_get_gamelang_localized.
Оно присваивается, потом по возможности переприсваивается, и потом без всяких проверок валидности возвращается наружу. При этом минимум одна из опций - взять значение из настроек аккаунта, т.е. из базы, в которой может оказаться все, что угодно.
После чего, с этим lang в остальном коде делается все что угодно, причем в разных местах, разбросанных по коду.

Вообще вся эта локализация выглядит стремно и сыро, и требует не просто добавления множественных проверок, а переработки самой логики, чтобы эти проверки были естественной ее частью, ИМХО.

Подумалось: может быть, мой сервер падал, когда когда просто кто-нибудь подключался клиентом с хитрым языком (типа какого-нибудь испанского/португальского), в результате чего нужный файл motd или help не мог открыться, и сервер падал, причем не сразу, а при попытке обращения к этому файлу?

Добавлено: 24.12.2014 10:52

HarpyWar опять пропал, и опять как-то проект пока подвис, у меня тоже как-то ни времени нет, ни сил, заниматься...

Наверно займусь в ближайшие дни допиливанием:
Во-первых, огромное спасибо за такую замечательную обертку для *alloc-free функций!
Есть план дополнить эту обертку:
1. вести связный список выделенных участков памяти.
Добавляя элементы в x*alloc, удаляя в free. При этом сохраняя имена функций/строки, где происходило выделение памяти. Это позволит отслеживать неосвобожденную память при завершении программы или по требованию.
2. выделять памяти не указанный size, а на несколько байт (килобайт, если большой кусок памяти) больше. Остаток дополнять контрольными данными, которые можно проверять по требованию.
Это позволит отслеживать переполнения, а также защищать данные от разрушения в случае, если переполнение все же произойдет.
3. добавить /команду для форсирования сброса в логи текущего состояния.

Добавлено: 25.12.2014 19:31

Значит, написал класс работы с памятью - сделал все по своему плану, кроме /команды для дампа. Пока дамп делается только при выходе. Пожалуй, единственное возможное нарушение - самописный вариант не привязывает передаваемую программе память к границам параграфа (или к чему там она может быть привязана). Очень сомневаюсь, что для данного проекта это имеет значение.
Издеваюсь над последней версией с github:

Получил массу интересных результатов:
1. до загрузки main, уже используется xalloc - загружается bigint и что-то еще, уже не помню...
Пришлось свой класс инициализировать тоже не в main, а раньше.
При завершении программы (в режиме - запустил сервер, подождал окончания загрузки, остановил) не выгружаются из памяти:
bigint.cpp, 140, 50
common/util.cpp, 582
bnetd/attr.h, 42, 45, 46
common/list.cpp, 39
bnetd/icons.cpp, 922, 986, 987, 754, 755 и т.д.
common/list.cpp, 39, 104
bnetd/anongame_infos.cpp, 420
bnetd/sql_common.cpp, 342

2. malloc чаще всего выделяет память, забитую нулями, но не всегда. Попробовал инициализировать ее не нулями - сразу при загрузке получил ошибку чтения конфига с не \0-терм именем.
Жестко инициализировал память нулями.

3. realloc. Обычно просто расширяет существующий диапазон, добавляя места к концу уже заполненного массива данных. Но не всегда. Попробовал реализовать realloc, всегда выделяющий память в другом месте и с пустыми данными. Программа не запустилась, выдав ошибку в /bnetd/ladder.cpp про "I found 0 for a level XP".
Добавил в realloc всегда копирование исходного буфера - все запустилось.

4. Выхода за границы выделенного мной диапазона (с перезаписью) пока программу вывести не удалось.

Пока все.
Идеи:
- запускаю программу на тестовом стенде в максимально жестком режиме, вылавливаю и исправляю все ошибки, которые удастся.
- добавляю вывод в логи ошибок про каждое невозможное в соответствии с логикой работы событие. Чтобы хотя бы оно писало, что указатель был нулевой, прежде чем упасть.
- гоняю программу под valgrind, до полного прояснения и исправления всех ошибок.

- запускаю программу в продакшен в максимально мягком режиме работы с памятью (инициализируя нулями, копируя realloc, выделяя больше памяти, чем нужно и т.п.) и запускаю народ. Жду падений и/или ошибок в логах.
Как-то так...

Добавлено: 29.12.2014 15:33

Да, проблема...
Решил использовать свой класс как сборщик мусора - чтобы он автоматом подчищал все, выделенное с помощью xmalloc - не тут-то было!
Оказалось, по всему проекту раскиданы всякие глобальные static и прочие объекты, которые инициализируются в непойми каком порядке, и соответственно, вызывающие xmalloc. Значит, надо проинициализироваться до них всех, а потом освободить память после их завершения.
А то получается, сначала я очищаю все выделенное программой, а потом valgrind находит еще 300+ неудаленных кусков памяти в 2-3 разных классах... А инициализация/деинициализация static-объектов как известно, происходит в порядке, на усмотрение компилятора: forum.sources.ru/index.php?showt … 8&st=0

И вот как мне загрузить свой менеджер памяти до них всех, соответственно, чтобы он выгрузился последним - это вопрос, и я понятия не имею, что с этим делать...

42

Re: core dump. Сервер падает под freebsd 10

Думаю, что на Windows те же самые проблемы.

По поводу тех ошибок, которые удалось найти, согласен - жду коммитов на гитхаб! С локализацией сейчас нет возможности проверить, насколько я помню именно в этой части должно работать стабильно. Но там где help файл и локализация, возможно есть такая проблема, надо посмотреть.

Временно не могу вплотную заняться этими вопросами, и новая информация по возможным вариантам разрешения текущей застрявшей ситуации крайне приветствуется!

Do not ask for support in PM.

43

Re: core dump. Сервер падает под freebsd 10

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

Надеюсь, вернусь к обновлениям pvpgn в будущем, но сейчас это не приоритет №1.
Скорее всего, вернусь когда дойдет очередь до кастомных иконок.

Изолировать бы как-то все эти падения куда-нибудь в песочницу, чтобы обращение к NULL в каком-нибудь совсем левом вспомогательном модуле, типа писания логов команд юзеров не роняло в кору весь процесс. Только вот как?..
А то каждый раз объяснять 100 юзерам "какого ... опять все упало" - надоедает...
А может, можно как-то прицепить тестовый пвпгн к текущему стабильному, чтобы он получал от него все пакеты юзеров, чтобы ответы просто игнорировались? Типа как пересылать копию всего сетевого трафика для другого pvpgn на его сокеты? Тогда и логи будут писаться, и падать он будет не хуже чем в штатном режиме, и юзеры ничего не заметят?

Из того, что бы я мог сейчас закоммитить - дописанный мной в xalloc класс для работы с памятью: при каждом выделении дописывает вокруг выделяемой памяти 4 байта с сигнатурой, которую проверяет при освобождении, ругаясь в лог, если она разрушена. И строит список выделенных кусков памяти.
Под нагрузкой не проверял, под windows не тестировал. Но от переполнений должно защищать и тем более их ловить. Но при этом - съедать больше памяти, наверно раза в полтора...
Потестирую и выложу коммит на досуге...

44

Re: core dump. Сервер падает под freebsd 10

Это действительно был бы лучший способ для тестирования на реальной нагрузке stackoverflow.com/questions/5312 … ne-process. Выглядит очень интересно, только могут возникнуть сложности. Например, оба сервера не могут слушать на одном IP тот же порт, и нужно его как-то изменять при ретрансляции!

Класс для работы памяти стоит завернуть в #ifdef DEBUG, чтобы в релизном билде работало как обычно. Получится так?

Запустил тестовый сервер на windows по адресу server.pvpgn.pro. Решил воспользоваться, пока у Селектела продолжается бесплатный бета тест облака openstack. Если есть возможность направить туда несколько игроков, чтобы они иногда там играли, то это может помочь отловить ошибки!

Do not ask for support in PM.

45

Re: core dump. Сервер падает под freebsd 10

HarpyWar wrote:

Это действительно был бы лучший способ для тестирования на реальной нагрузке stackoverflow.com/questions/5312 … ne-process. Выглядит очень интересно, только могут возникнуть сложности. Например, оба сервера не могут слушать на одном IP тот же порт, и нужно его как-то изменять при ретрансляции!

Подумалось тут, возможно на правах ламерского бреда, но все же:
Сильно ли нереально реализовать что-то типа отказоустойчивого кластера для pvpgn?

Допустим, для начала разместить оба сервера на одном хосте.
Основная нода работает некоторое время. Потом запускаем резервную ноду, которая считывает данные основной (например, как раз из механизма управления памятью, только в него надо все остальное завернуть тоже, не только создаваемое xalloc-функциями). Такая синхронизация должна делаться в каком-нибудь безопасном состоянии, где-то в mainloop (приостановив главную ноду семафором). При этом надо корректно клонировать память, значения всех переменных, а еще и открытые сокеты...
В общем, пока писал, кажется сам понял, что глупость получается, хотя, может быть, есть какие-нибудь решения подобного рода, надо погуглить...

Для разных портов это я так понимаю надо враппер, чтобы тупо пересылал данные. Одному серверу на один порт, другому - на другой. При этом у 2-го сервера все равно слой виртуализации надо делать для сети, чтобы и запросы к серверу шли на левый порт, и ответы от сервера уходили в никуда. И еще интересно, что делать с запросами от сервера к клиентам несуществующим?.. В общем, идея кажется не очень жизнеспособна...

HarpyWar wrote:

Класс для работы памяти стоит завернуть в #ifdef DEBUG, чтобы в релизном билде работало как обычно. Получится так?

Конечно, механизмы в DEBUG завернуты, в мой собственный MEMDEBUG. И еще 2 режима тоже через define: максимально жестко все инициализировать память мусором и при realloc затирать данные, либо всегда инициализировать нулями и realloc копировать. В "жестком" режиме сразу при старте в нескольких местах все некорректно сработало, и пвпгн упал smile

А вообще, что-то смотрю я на Си в этом проекте, и все больше мне C++ нравится.  Конструкторы, деструкторы, сам за собой мусор убирает, о видимости объекта беспокоиться не надо. Хоть я и совсем не знаток C++, но количество ляпов, спровоцированных чистым С в проекте просто зашкаливает... (на правах оффтопа)

HarpyWar wrote:

Запустил тестовый сервер на windows по адресу server.pvpgn.pro. Решил воспользоваться, пока у Селектела продолжается бесплатный бета тест облака openstack. Если есть возможность направить туда несколько игроков, чтобы они иногда там играли, то это может помочь отловить ошибки!

Ну да, было уже, проходили: запустил на тестовом сервере - заходите, тестируйте - зашло 3 человека, все хорошо дня 3 проработало.
Запустил на основном - через 2 часа набежало 50 человек, и сервер рухнул...

46

Re: core dump. Сервер падает под freebsd 10

В старом bnetd был BITS, который был выпилен в PvPGN. Нужно разобраться почему, и как именно он работает https://github.com/HarpyWar/pvpgn/issues/45. Может это то что нужно, а может и нет!

С переписыванием на C++ предлагали, пока нет результатов https://github.com/HarpyWar/pvpgn/issues/50
Это хорошо и при должном подходе поможет многое исправитью Только у меня недостаточно опыта для такого основательного переписывания. При желании можно присоединиться в любое время и обсудить там с чего лучше начать!

Сервер запущен на Windows, там дампы указывают прямо в место, где произошла ошибка. По крайней мере, всегда когда у меня создавался дамп, было понятно из-за чего произошло падение. Думаю так будет проще ловить ошибки!

Do not ask for support in PM.

47

Re: core dump. Сервер падает под freebsd 10

По поводу BITS - похоже, что он закончился на стадии "вроде, должен работать в режиме чата для ботов"...

С переписыванием на C++ - я бы начал с тех кусков, про которые писал: которые сырые и в которых не хватает на мой взгляд очевидных проверок. Главное - в ядро системы не лезть, отрывая и переписывая маленькие независимые кусочки, сохраняя 100% совместимость и добавляя проверки на все что только можно...
Писал тут несколько дней назад проект на winapi - замучился с проверками всех возвращаемых значений (причем половины - через передаваемые параметрами ссылки), пока не сообразил все это в классы обернуть - до чего же удобно - все проверки внутри самого класса, об удалении возвращаемого объекта думать не надо, как и обо всех его свойствах.
Я тоже С++ плоховато знаю: на уровне примерного представления о конструкторе копирования - всегда было проще понаделать функций и переменных, обычно глобальных, чем мыслить объектами и их методами... Но в последнее время оценил.

Я так вижу, в ПВПГН тоже всякие std::string и vector кое-где встречается - явно более позднее усовершенствование, чем исходный 1.8.5.
Гораздо приятнее с std::string работать, чем с char * - ни следить за переполнением не надо, ни память освобождать. Хотя и приходится его по хелпу изучать...

Про windows-хостинг не знаю - тяжеловато мне на него переходить - там много всего крутится на этом сервере, да и смысла не вижу: хочется сначала от падений избавиться, а потом уже юзеров запускать туда.

Вообще хороший вариант я думаю обертки такие делать, как для malloc-realloc: чаще всего выделенный диапазон нулями забит, но иногда и нет. Чаще всего realloc оставляет ту же память с теми же данными, добавляя кусок в конце, но иногда и нет. Но судя по моим тестам, авторы не очень внимательно относятся к этому "иногда". Так сделаем обертку и проинициализируем память нулями, скопируем старый массив в нее - пусть программа всегда получает то, на что надеялись авторы.
Как еще идея - в структуры дописать конструкторы и деструкторы - пусть они тоже все нулями инициализируют и заодно за удалением следят.
Написал, и аж заняться захотелось, главное - время найти.

Posts: 47

Pages 1

You must login or register to post a reply

Who now at forum

Currently view post: 0 guests, 0 registered users

forums.pvpgn.pro → [RU] Research & Development → core dump. Сервер падает под freebsd 10