Berkus
я думаю увидите много удивительного
Berkus
лучше всего прогонять несколько разных
Berkus
clang-analyzer, coverity, PVS Studio как минимум
Berkus
забавно
Berkus
тогда какая-то эзотерика похоже
Billy
Да вот именно
Berkus
типа shared_ptr циклов
Billy
Да нету в коде их
Berkus
типа
Billy
Никто нр использовал шаред птры тогда
Billy
Просто все на голых указателях
Billy
Там 3 сосны с шаред птр есть. Но если там кто-то заблудился я ебанусь. Хотя я уже ничему не удивляюсь ;)
Matwey
А пометить данные нельзя?
Billy
Вывод про лики сделали след образом. Есть график количества клинтов от времени. Скажем интервал в течение года. И такой же по памяти. По памяти график растет. По пользователям нет.
Matwey
Подробнее плиз, что имеется ввиду?
Если это утечка, то в дампе останутся валидные данные. Теоретически, с помощью gdb, я подозреваю, что можно написать скрипт который найдет области памяти без ссылок из основного кода. Может быть можно проще, сейчас поправят. Далее, если у нас каждый экземпляр класса хранит в себе магическую константу, мы ее в такой нечейной памяти увидим глазами. И поймем примерно кто утек.
Matwey
Это может подсказать откуда он утек
Berkus
ну кстати да, можно унаследовать все классы от класса Marker у которого первым словом будет __MARKER__
Berkus
а в delete сделать затирание этой области памяти каким-нибудь 0xAD
Berkus
ну и собственно после снапшота памяти все области в которых есть MARKER будут или иметь ссылки на них или будут утечками
Billy
Billy
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
Berkus
http://www.tcpdump.org
Berkus
https://github.com/the-tcpdump-group/libpcap
Berkus
можно на коммутаторе, все равно надо будет чем-то записывать - pcap вот для этого
Philipp
Добрый день. Ребятки, есть у кого опыт работы Qt+MySQL? А то возникла проблема на старте...
Nik
ask to ask to ask...
mefest
Philipp
Вот, на тостере описал подробно https://toster.ru/q/471381
Philipp
Уже есть в C:\Qt\Qt5.9.1\5.9.1\mingw53_32\plugins\sqldrivers
mefest
еее я экстрасенсер! пересобери драйвер
Anton
Billy
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
если она просто пропорционально растет при увеличении количества клиентов - ну это в общем-то понятно
🐙 Antony
у меня чистый си
Уже инлайнится для простых случаев https://godbolt.org/g/eRhztq
Berkus
Egor
@berkus ну сразу тип без тайпдефа записать
Egor
я о том, чтобы не писать тот самый тайпдеф
Egor
просто так скажем простыня нужна
Danil
лол
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);
}