Mediastreamer2 VoIP хөдөлгүүртэй танилцаж байна. 12-р хэсэг

Нийтлэлийн материалыг миний нийтлэлээс авсан болно zen суваг.

Mediastreamer2 VoIP хөдөлгүүртэй танилцаж байна. 12-р хэсэг

Хамгийн сүүлд нийтлэл, Би хэвлэл мэдээллийн дамжуулагчийн ачааллын тооцоолол, хэт их тооцооллын ачааллыг шийдвэрлэх арга замыг авч үзэхээ амласан. Гэхдээ би өгөгдлийн хөдөлгөөнтэй холбоотой гар урлалын шүүлтүүрийг дибаг хийх асуудлыг авч үзэх нь илүү логик байх болно гэж шийдсэн бөгөөд зөвхөн дараа нь гүйцэтгэлийг оновчтой болгох асуудлыг авч үзэх болно.

Гар урлалын шүүлтүүрийг дибаг хийх

Өмнөх нийтлэлд бид медиа дамжуулагч дахь өгөгдөл дамжуулах механизмыг судалсны дараа түүнд нуугдаж буй аюулын талаар ярих нь зүйтэй болов уу. "Өгөгдлийн урсгал" зарчмын нэг онцлог нь санах ойг бөөгнөрөлөөс хуваарилах нь өгөгдлийн урсгалын эх үүсвэрт байрлах шүүлтүүрүүдэд тохиолддог бөгөөд урсгалын замын төгсгөлд байрлах шүүлтүүрүүд нь санах ойг буцаах замаар аль хэдийн хуваарилсан байдаг. овоо руу. Үүнээс гадна шинэ өгөгдөл үүсгэх, тэдгээрийг устгах нь завсрын цэгүүдийн хаа нэгтээ тохиолдож болно. Ерөнхийдөө санах ойг суллах нь өгөгдлийн блок үүсгэсэн шүүлтүүрээс өөр шүүлтүүрээр хийгддэг.

Санах ойг ил тод хянах үүднээс шүүлтүүр нь оролтын блок хүлээн авахдаа түүнийг боловсруулсны дараа нэн даруй устгаж, санах ойг чөлөөлж, гаралтын өгөгдөл бүхий шинээр үүсгэсэн блокыг гаралт дээр байрлуулах нь зүйтэй юм. Энэ тохиолдолд шүүлтүүр дэх санах ойн алдагдлыг хялбархан хянах боломжтой - хэрэв анализатор шүүлтүүрт алдагдсаныг илрүүлсэн бол түүнийг дагаж байгаа шүүлтүүр нь ирж буй блокуудыг зохих ёсоор устгадаггүй бөгөөд алдаа гарсан байна. Гэхдээ өндөр гүйцэтгэлтэй байх үүднээс өгөгдлийн блокуудтай ажиллах ийм хандлага нь үр дүнтэй биш юм - энэ нь ямар ч ашигтай утаагүйгээр өгөгдлийн блокуудад санах ойг хуваарилах / суллах олон тооны үйлдлүүдэд хүргэдэг.

Ийм учраас мэдээллийн боловсруулалтыг удаашруулахгүйн тулд медиа дамжуулагч шүүлтүүр нь мессежийг хуулахдаа хөнгөн хуулбар үүсгэх функцуудыг ашигладаг (бид өмнөх нийтлэлд эдгээрийн талаар ярьсан). Эдгээр функцууд нь хуулсан "хуучин" мессежийн өгөгдлийн блокийг "хавсгаснаар" зөвхөн мессежийн толгойн шинэ хуулбарыг үүсгэдэг. Үүний үр дүнд нэг өгөгдлийн блокт хоёр толгой хавсаргасан бөгөөд өгөгдлийн блок дахь лавлагааны тоолуур нэмэгддэг. Гэхдээ энэ нь хоёр мессеж шиг харагдах болно. Ийм "хуваалцсан" өгөгдлийн блоктой илүү олон мессеж байж болно, жишээлбэл, MS_TEE шүүлтүүр нь нэг дор арван ийм хөнгөн хуулбарыг үүсгэж, гаралтынхаа дунд хуваарилдаг. Хэрэв гинжин хэлхээний бүх шүүлтүүрүүд зөв ажиллаж байвал дамжуулах хоолойн төгсгөлд энэ лавлагааны тоо тэг болж, санах ойн хуваарилалтын функцийг дуудах болно: ms_free(). Хэрэв дуудлага ирэхгүй бол санах ойн хэсэг нь овоолго руу буцаж ирэхээ болино, өөрөөр хэлбэл. тэр "алддаг". Хөнгөн хуулбарыг ашиглах зардал нь санах ой ямар график шүүлтүүрээр урсаж байгааг хялбархан тодорхойлох чадвараа (ердийн хуулбарыг ашиглахтай адил) алдах явдал юм.

"Уугуул" шүүлтүүр дэх санах ойн алдагдлыг олох үүрэг нь медиа дамжуулагч хөгжүүлэгчид байдаг тул та тэдгээрийг дибаг хийх шаардлагагүй болно. Гэхдээ гар урлалын шүүлтүүрээрээ та өөрөө өөрийнхөө аз жаргалын царцаа бөгөөд кодын алдагдлыг хайхад зарцуулсан хугацаа нь таны үнэн зөв эсэхээс хамаарна. Дибаг хийх хугацааг багасгахын тулд шүүлтүүрийг зохион бүтээхдээ алдагдлыг нутагшуулах арга техникийг анхаарч үзэх хэрэгтэй. Нэмж дурдахад, "сэжигтнүүдийн" тоо асар их, дибаг хийх хугацаа хязгаарлагдмал байдаг бодит системд шүүлтүүр хэрэглэх үед л гоожсон байдал илэрч магадгүй юм.

Санах ойн алдагдал хэрхэн илэрдэг вэ?

Програмын гаралтад гэж үзэх нь логик юм шилдэг таны програмын эзэлдэг санах ойн өсөн нэмэгдэж буй хувийг харуулах болно.

Гадны илрэл нь хэзээ нэгэн цагт систем хулганын хөдөлгөөнд удаан хариу үйлдэл үзүүлж, дэлгэцийг аажмаар дахин зурах явдал юм. Мөн системийн бүртгэл томорч, хатуу дискний зай эзэлнэ. Энэ тохиолдолд таны програм хачирхалтай ажиллаж эхлэх, командуудад хариу өгөхгүй, файлыг нээж чадахгүй гэх мэт.

Нэвчилтийг тодорхойлохын тулд бид санах ойн анализатор (цаашид анализатор гэх) ашиглана. Энэ байж болох юм Валгринд (сайн нийтлэл тухай) эсвэл хөрвүүлэгчид суулгасан gcc Санах ойн ариутгагч эсвэл өөр зүйл. Хэрэв анализатор нь график шүүлтүүрүүдийн аль нэгэнд гоожиж байгааг харуулж байвал доор тайлбарласан аргуудын аль нэгийг ашиглах цаг болсон гэсэн үг юм.

Гурван нарс арга

Дээр дурдсанчлан санах ой алдагдсан тохиолдолд анализатор нь овоолгоос санах ойн хуваарилалтыг хүссэн шүүлтүүр рүү чиглүүлэх болно. Гэхдээ үүнийг буцааж өгөхөө "мартсан" шүүлтүүрийг зааж өгөхгүй бөгөөд энэ нь үнэн хэрэгтээ буруутай юм. Тиймээс анализатор нь зөвхөн бидний айдсыг баталж чадна, гэхдээ тэдний үндсийг зааж чадахгүй.

График дахь "муу" шүүлтүүрийн байршлыг олж мэдэхийн тулд анализатор алдагдлыг илрүүлсэн хамгийн бага тооны зангилааны тоо хүртэл графикийг багасгаж, үлдсэн гурван нарс дахь асуудалтай шүүлтүүрийг олох боломжтой.

Гэхдээ багана дахь шүүлтүүрийн тоог бууруулснаар шүүлтүүрүүд болон системийн бусад элементүүдийн хоорондын харилцан үйлчлэлийн хэвийн үйл ажиллагааг тасалдуулж, гоожиж байхаа болино. Энэ тохиолдолд та бүрэн хэмжээний графиктай ажиллаж, доор тайлбарласан аргыг ашиглах хэрэгтэй болно.

Гулгадаг тусгаарлагчийн арга

Үзүүлэнг хялбар болгохын тулд бид нэг гинжин шүүлтүүрээс бүрдэх графикийг ашиглана. Тэр зураг дээр харагдаж байна.

Mediastreamer2 VoIP хөдөлгүүртэй танилцаж байна. 12-р хэсэг

Энгийн график бөгөөд үүнд бэлэн медиа дамжуулагч шүүлтүүрүүд, дөрвөн гар урлалын шүүлтүүр F1…F4 ашигладаг бөгөөд таны аль эрт хийсэн дөрвөн төрлийн шүүлтүүр байдаг бөгөөд тэдгээрийн зөв гэдэгт эргэлзэхгүй байна. Гэсэн хэдий ч тэдгээрийн хэд хэдэн нь санах ойн алдагдалтай байна гэж бодъё. Манай анализаторын хяналтын программыг ажиллуулахдаа бид түүний тайлангаас тодорхой шүүлтүүр тодорхой хэмжээний санах ойг хүссэн бөгөөд түүнийг N удаа овоолго руу буцаагаагүйг олж мэдсэн. MS_VOID_SOURCE төрлийн дотоод шүүлтүүрийн функцүүдийн лавлагаа байх болно гэдгийг таахад хялбар байдаг. Түүний даалгавар бол овооноос санах ойг авах явдал юм. Бусад шүүлтүүрүүд үүнийг буцааж өгөх ёстой. Тэдгээр. Бид алдагдлыг олох болно.

Дамжуулах хоолойн аль хэсэгт идэвхгүй байдал үүссэн нь санах ой алдагдсаныг тодорхойлохын тулд мессежийг оролтоос гаралт руу шилжүүлдэг нэмэлт шүүлтүүрийг нэвтрүүлэхийг санал болгож байна. Оруулсан мессежийн "хүнд" хуулбар, дараа нь гаралт дээр ирсэн мессежийг бүрэн устгана. Ийм шүүлтүүрийг бид тусгаарлагч гэж нэрлэх болно. Шүүлтүүр нь энгийн тул гоожихыг үгүйсгэхгүй гэж бид үзэж байна. Бас нэг эерэг шинж чанар - хэрэв бид үүнийг графикынхаа аль ч хэсэгт нэмбэл энэ нь хэлхээний үйл ажиллагаанд ямар ч байдлаар нөлөөлөхгүй. Бид тусгаарлагч шүүлтүүрийг давхар контуртай тойрог хэлбэрээр дүрслэх болно.

Хоосон эх үүсвэрийн шүүлтүүрийн дараа тусгаарлагчийг идэвхжүүлнэ үү:
Mediastreamer2 VoIP хөдөлгүүртэй танилцаж байна. 12-р хэсэг

Бид програмыг анализатортой дахин ажиллуулж, энэ удаад анализатор бурууг тусгаарлагч дээр үүрэх болно гэдгийг бид харж байна. Эцсийн эцэст, тэр бол одоо үл мэдэгдэх хайхрамжгүй шүүлтүүр (эсвэл шүүлтүүр) -ээр алдагдсан мэдээллийн блокуудыг үүсгэдэг хүн юм. Дараагийн алхам бол тусгаарлагчийг гинжин хэлхээний дагуу баруун тийш, нэг шүүлтүүрээр шилжүүлж, дахин шинжилгээг эхлүүлэх явдал юм. Тиймээс, алхам алхмаар тусгаарлагчийг баруун тийш шилжүүлэхэд анализаторын дараагийн тайланд "алдсан" санах ойн блокуудын тоо буурах нөхцөл байдал үүсдэг. Энэ нь энэ үе шатанд тусгаарлагч нь асуудалтай шүүлтүүрийн дараа шууд гинжин хэлхээнд орсон гэсэн үг юм. Хэрэв зөвхөн нэг "муу" шүүлтүүр байсан бол гоожих нь бүрмөсөн алга болно. Тиймээс бид асуудалтай шүүлтүүрийг (эсвэл хэд хэдэн шүүлтүүрийн аль нэгийг) нутагшуулсан. Шүүлтүүрийг "засасны" дараа бид санах ойн алдагдлыг бүрэн арилгах хүртэл тусгаарлагчийг гинжин хэлхээний дагуу баруун тийш шилжүүлж болно.

Тусгаарлагч шүүлтүүрийг нэвтрүүлэх

Тусгаарлагчийн хэрэгжилт нь ердийн шүүлтүүр шиг харагдаж байна. Толгой файл:

/* Файл iso_filter.h  Описание изолирующего фильтра. */

#ifndef iso_filter_h
#define iso_filter_h

/* Задаем идентификатор фильтра. */
#include <mediastreamer2/msfilter.h>

#define MY_ISO_FILTER_ID 1024

extern MSFilterDesc iso_filter_desc;

#endif

Шүүлтүүр өөрөө:

/* Файл iso_filter.c  Описание изолирующего фильтра. */

#include "iso_filter.h"

    static void
iso_init (MSFilter * f)
{
}
    static void
iso_uninit (MSFilter * f)
{
}

    static void
iso_process (MSFilter * f)
{
    mblk_t *im;

    while ((im = ms_queue_get (f->inputs[0])) != NULL)
    {
        ms_queue_put (f->outputs[0], copymsg (im));
        freemsg (im);
    }
}

static MSFilterMethod iso_methods[] = {
    {0, NULL}
};

MSFilterDesc iso_filter_desc = {
    MY_ISO_FILTER_ID,
    "iso_filter",
    "A filter that reads from input and copy to its output.",
    MS_FILTER_OTHER,
    NULL,
    1,
    1,
    iso_init,
    NULL,
    iso_process,
    NULL,
    iso_uninit,
    iso_methods
};

MS_FILTER_DESC_EXPORT (iso_desc)

Санах ойн удирдлагын функцийг солих арга

Илүү нарийн судалгаа хийхийн тулд медиа дамжуулагч нь санах ойн хандалтын функцийг өөрийн функцээр солих боломжийг олгодог бөгөөд энэ нь үндсэн ажлаас гадна "Хэн, хаана, яагаад" засах болно. Гурван функцийг сольж байна. Үүнийг дараах байдлаар гүйцэтгэнэ.

OrtpMemoryFunctions reserv;
OrtpMemoryFunctions my;

reserv.malloc_fun = ortp_malloc;
reserv.realloc_fun = ortp_realloc;
reserv.free_fun = ortp_free;

my.malloc_fun = &my_malloc;
my.realloc_fun = &my_realloc;
my.free_fun = &my_free;

ortp_set_memory_functions(&my);

Энэ шинж чанар нь анализатор шүүлтүүрийг удаашруулж, бидний хэлхээг суурилуулсан системийн ажиллагааг тасалдуулж байгаа тохиолдолд аврах ажилд ирдэг. Ийм нөхцөлд та анализатороо орхиж, санах ойн функцийг орлуулах хэрэгтэй.

Салбар агуулаагүй энгийн графикийн үйлдлийн алгоритмыг бид авч үзсэн. Гэхдээ энэ аргыг бусад тохиолдолд хэрэглэж болно, мэдээжийн хэрэг хүндрэлтэй, гэхдээ санаа нь хэвээр байна.

Дараагийн өгүүллээр бид тикер ачааллын тооцоолол, медиа дамжуулагчийн хэт их тооцооллын ачааллыг хэрхэн шийдвэрлэх талаар авч үзэх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх