Berkus
я думаю увидите много удивительного
Berkus
лучше всего прогонять несколько разных
Berkus
clang-analyzer, coverity, PVS Studio как минимум
Billy
начните со статического анализатора кода
Да. Запускал. Скажем так. Все что можно уже пофиксили
Billy
clang-analyzer, coverity, PVS Studio как минимум
Там как ни странно мало проблем находится. Потому что ну там все-таки варнинги, варн как ошибка и базовые статические проверки были включены всегда.
Berkus
забавно
Berkus
тогда какая-то эзотерика похоже
Billy
Да вот именно
Berkus
типа shared_ptr циклов
Billy
Да нету в коде их
Berkus
типа
Billy
Никто нр использовал шаред птры тогда
Billy
Просто все на голых указателях
Billy
Там 3 сосны с шаред птр есть. Но если там кто-то заблудился я ебанусь. Хотя я уже ничему не удивляюсь ;)
Matwey
А пометить данные нельзя?
Billy
Вывод про лики сделали след образом. Есть график количества клинтов от времени. Скажем интервал в течение года. И такой же по памяти. По памяти график растет. По пользователям нет.
Billy
А пометить данные нельзя?
Подробнее плиз, что имеется ввиду?
Matwey
Подробнее плиз, что имеется ввиду?
Если это утечка, то в дампе останутся валидные данные. Теоретически, с помощью gdb, я подозреваю, что можно написать скрипт который найдет области памяти без ссылок из основного кода. Может быть можно проще, сейчас поправят. Далее, если у нас каждый экземпляр класса хранит в себе магическую константу, мы ее в такой нечейной памяти увидим глазами. И поймем примерно кто утек.
Matwey
Это может подсказать откуда он утек
Berkus
ну кстати да, можно унаследовать все классы от класса Marker у которого первым словом будет __MARKER__
Berkus
а в delete сделать затирание этой области памяти каким-нибудь 0xAD
Berkus
ну и собственно после снапшота памяти все области в которых есть MARKER будут или иметь ссылки на них или будут утечками
Matwey
gdb attach
Berkus
ну через гдб например
Matwey
И просишь его сделать дамп
Berkus
можно и дамп не делать
Berkus
стопануть все треды и гдб скриптом прошерстить память
Billy
Понятно. С этим разберусь.
Billy
Там один тред ;) это реактор самописный ;)
Billy
ну через гдб например
Да понят. спасиб
Billy
спасибо за советы, коллеги. О результатах отпишусь, как что найдем.
Berkus
да, будет интересно послушать, спасибо
Billy
Спасибо за поддержку;) вдохновляетъ!
Berkus
ну самое удобное - записать кусок трафика, а потом повторно его воспроизводить - должно течь примерно так же
Billy
ну самое удобное - записать кусок трафика, а потом повторно его воспроизводить - должно течь примерно так же
Да. Но для этого нету ровным счетом ничего готового у нас. Это как самый крайний вариант пока.
Berkus
прямо на входном порте сервера вешаешь tun/tap
Berkus
все что туда приходит записываешь wireshark или tcprecord-ом
Billy
Ага. Спасибо.
Berkus
http://tcpreplay.synfin.net
Matwey
все что туда приходит записываешь wireshark или tcprecord-ом
Да с коммутатора прямо отзеркалить порт и готово
Berkus
http://www.tcpdump.org
Berkus
https://github.com/the-tcpdump-group/libpcap
Berkus
можно на коммутаторе, все равно надо будет чем-то записывать - pcap вот для этого
Philipp
Добрый день. Ребятки, есть у кого опыт работы Qt+MySQL? А то возникла проблема на старте...
Nik
ask to ask to ask...
Philipp
Вот, на тостере описал подробно https://toster.ru/q/471381
Philipp
Уже есть в C:\Qt\Qt5.9.1\5.9.1\mingw53_32\plugins\sqldrivers
mefest
еее я экстрасенсер! пересобери драйвер
Billy
сейчас идет стадия проверки всех 760 деструкторов. мне бльн и я в середине пути )
Philipp
@mefest пересобрать не смог... Зато все заработало при переключении с MinGW-x32 на MVS2017-x64
Billy
Я тут решил на всякий случай сделать сайнити чек еще. Вывод по ликам сделали на основании 2х графиков, один количество клиентов, а другой резиденная память.
Billy
Первый в среднем констната, второй однако растет. Вот сторой график это число прочитанное из /proc/pid/stat. RSS которое, про него написано в мане: Resident Set Size: number of pages the process has in real memory. This is just the pages which count toward text, data, or stack space. This does not include pages which have not been demand-loaded in, or which are swapped out.
Billy
Вопрос то в следуюем: если RSS растет со временем то это явно ведь указывает на лик? или это все не более чем заблуждение?
Egor
кукусики, i've a question: typedef void (*pt2Func)(); void test() { printf("\ntest"); } int call(void* a) { (( pt2Func )a)(); } int main(int argc, char** argv) { call((void*)test); return 0; } как можно заинлайнить тип pt2Func?
🐙 Antony
void test() { printf("\ntest"); } template <class F> int call(F a) { a(); } int main() { call(test); }
Egor
у меня чистый си
Berkus
Вопрос то в следуюем: если RSS растет со временем то это явно ведь указывает на лик? или это все не более чем заблуждение?
теоретически да, практически я бы больше доверял диагностике ASAN если память на боксе рано или поздно кончается при примерно постоянном количестве клиентов - значит течёт
Berkus
если она просто пропорционально растет при увеличении количества клиентов - ну это в общем-то понятно
🐙 Antony
у меня чистый си
Уже инлайнится для простых случаев https://godbolt.org/g/eRhztq
Egor
@berkus ну сразу тип без тайпдефа записать
Egor
я о том, чтобы не писать тот самый тайпдеф
Egor
просто так скажем простыня нужна
Danil
лол
🐙 Antony
@berkus ну сразу тип без тайпдефа записать
#include <stdio.h> static void test() { printf("\ntest"); } int call(void (*a)() ) { a(); } int main() { call(test); }
Egor
этот вариант не подходит
Egor
в аргументе должен быть void* a
Berkus
ну разверни тайпдеф во всех местах где он применяется и всё
Egor
так а как, я не могу допереть
🐙 Antony
С typedef будет намного читабельнее
🐙 Antony
оставь как есть
Egor
да, я понимаю, но мне нужно для себя
Egor
я бдсм люблю
🐙 Antony
да, я понимаю, но мне нужно для себя
#include <stdio.h> static void test() { printf("\ntest"); } int call(void *a ) { ((void(*)())a)(); } int main() { call((void*)test); }
Berkus
так а как, я не могу допереть
берешь и вместо правой части тайпдефа подставляешь правую, иногда в скобках