hugoam / kiui

Auto-layout Ui library, lightweight, skinnable and system agnostic, with an OpenGL backend
zlib License
749 stars 71 forks source link

Valgrind report #1 #18

Open alexeyknyshev opened 9 years ago

alexeyknyshev commented 9 years ago

Hi, I've run valgrind memory analyzer on kiui_example. Everything below may be missdetected problems. There are some interesting places to check:

  1. Once on startup:

    Source and destination overlap in memcpy(0xeca1370, 0xeca1370, 2016) in nvg__drawListRenderTriangles at /home/alexey/dev/src/kiui/src/Ui/Nano/nanovg/nanovg.c:625 1: memcpy@@GLIBC_2.14 в /mnt/valgrind-3.10.0/memcheck/../shared/vg_replace_strmem.c:915 2: nvgdrawListRenderTriangles в /home/alexey/dev/src/kiui/src/Ui/Nano/nanovg/nanovg.c:625 3: nvgrenderText в /home/alexey/dev/src/kiui/src/Ui/Nano/nanovg/nanovg.c:2914 4: nvgText в /home/alexey/dev/src/kiui/src/Ui/Nano/nanovg/nanovg.c:2991 5: mk::NanoInk::redrawText() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoInk.cpp:367 6: mk::NanoInk::drawText() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoInk.cpp:273 7: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:222 8: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 9: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 10: mk::NanoLayer::nanodraw() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:207 11: mk::NanoTarget::nanodraw() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:240 12: mk::NanoWindow::nextFrame(double, double) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:293 13: mk::GlWindow::renderFrame() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkGlWindow.cpp:265 14: main в /home/alexey/dev/src/kiui/example/example.cpp:44

  2. Running example long time, error reported on exit:

    8,064 bytes in 168 blocks are definitely lost in loss record 127 of 129 in nvgCreateDisplayList at /home/alexey/dev/src/kiui/src/Ui/Nano/nanovg/nanovg.c:636 1: malloc в /mnt/valgrind-3.10.0/coregrind/m_replacemalloc/vg_replace_malloc.c:296 2: nvgCreateDisplayList в /home/alexey/dev/src/kiui/src/Ui/Nano/nanovg/nanovg.c:636 3: mk::NanoInk::drawText() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoInk.cpp:270 4: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:222 5: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 6: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 7: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 8: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 9: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 10: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 11: mk::NanoLayer::drawText(mk::Frame&) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:227 12: mk::NanoLayer::nanodraw() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:207 13: mk::NanoTarget::nanodraw() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:240 14: mk::NanoWindow::nextFrame(double, double) в /home/alexey/dev/src/kiui/src/Ui/Nano/mkNanoWindow.cpp:293 15: mk::GlWindow::renderFrame() в /home/alexey/dev/src/kiui/src/Ui/Nano/mkGlWindow.cpp:265 16: main в /home/alexey/dev/src/kiui/example/example.cpp:44

And such a lot of similar reports about nvgCreateDisplayList

Regards, Alexey Knyshev

hugoam commented 9 years ago

Thanks for the report. I know that there is something fishy going on with memory but sadly I'm not the one who wrote that code. I'm using a fork of NanoVG which implemented display lists to enhance performance, but I think it is not completely bug free yet. (It has not been pulled into NanoVG yet) To trigger a memory fuck-up, open the text editor, and resize it very narrow so that the text will be wrapped to a lot of lines. This will usually cause a crash. I believe all this is linked to the way memory is allocated and reallocated for displayLists (see all ****DisplayList functions in nanovg.c).