Mind.toBlog();'s Journal
 
[Most Recent Entries] [Calendar View] [Friends]

Below are the 3 most recent journal entries recorded in Mind.toBlog();'s LiveJournal:

    Thursday, May 10th, 2012
    9:07 am
    Autortiesības

    Raksts un komentāri par autortiesībām un Latvijas aku un laipu. Lai gan autoriem, protams, ir tiesības saņemt samaksu par savu darbu, man nepatīk, ka to iekasē visās iespējamās vietās un veidos: par datu nesējiem, kur es potenciāli varu kaut ko ierakstīt; no radio par atskaņošanu; no veikala un transporta, kur es potenciāli varētu to dzirdēt, ja neklausītos pleijeri; no darba vietas par to, ka radio mēģina slāpēt nepatīkamās skaņas labierīcībās; utt.

    Neesmu mūziķis, bet ja par man neļautu publicēt atvērto kodu un būtu speciāli jāraksta iesniegumi dažādās hvz organizācijās, kas pēc noklusēšanas mēģina par manu darbu iekasēt naudu… ^$&#*%&!!!

    8:08 am
    C (and C++) backtraces

    Lai gan C un C++ nav iebūvētu iespēju stack trace iegūšanai kā interpretējamās valodās, GLIBC bibliotēkā ir backtrace() funkcija, kas māk izdarīt ko līdzīgu. Tomēr, lai to pilnvērtīgi izmantotu, viss kods ir jākompilē ar GCC parametru -rdynamic: rezultātā visas funkcijas tiek eksportētas un dinamiski resolvētas, kas palielina programmas izmēru un samazina ātrdarbību. Faila nosaukumu un koda rindiņu tādā veidā nevar iegūt.

    Bet mazliet pacīnoties var izdarīt labāk. Komplektā ar GCC kompilatoru nāk header fails unwind.h ar vairākām noderīgām funkcijām. Viena no tām ir _Unwind_Backtrace, kas māk apstaigāt steku un katrā freimā izsaukt programmētāja norādīto funkciju. Ar _Unwind_GetIP var iegūt instrukcijas rādītāju. Programmas adreses var iegūt, bet ko tālāk?

    Ja programma ir kompilēta ar debug informāciju, tad GDB kaut kādā veidā māk pa soļiem izpildīt programmu un izdrukāt atbilstošās koda rindiņas. Par laimi ir maza programmiņa addr2line, kas māk nolasīt debug informāciju no izpildfailiem un izdrukāt konkrētai adresei atbilstošo funkcijas nosaukumu, failu un rindiņu tajā.

    Tas strādā mazām demo programmām, bet reālā dzīvē programma parasti izmanto bibliotēkas, pie tam daļu no bibliotēkām var ielādēt un izlādēt programmas izpildes laikā. Kā saprast kura adrese atbilst kurai bibliotēkai programmas izpildes laikā?

    Te nāk palīgā Linux /proc failu sistēma: /proc/<PID>/exe var atrast saiti uz pašu izpildfailu, bet /proc/<PID>/maps var atrast dotajā brīdī lietotās bibliotēka ar adrešu intervālu, kas tām piešķirts (un nobīdi bibliotēkas failā, jo viena bibliotēka tiek ielādēta dažādos adrešu intervālos). Tālāk mazliet aritmētikas un addr2line var norādīt pareizo izpildfailu un pareizo adresi.

    Saliekot visas šīs lietas kopā, var iegūt strādājošu backtrace() analogu ar detalizētāku informāciju. Kā iegūt C++ izņēmumu stack trace arī ir interesants temats, bet to vēlāk.

    Monday, April 30th, 2012
    7:08 pm
    .com

    Es nosapņoju, ka daudzas lietas dzīvē notiek cikliski, un šī brīža startup kults izbeigsies tāpat kā .com startupu burbulis.

Mind.toBlog();   About Sviesta Ciba