Cas

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Středa Listopad 4 10:14:40 CET 2015


On Wed, 4 Nov 2015, Martin Mokry wrote:

> Ospravedlnujem sa za nevedomost, ale ked som gdb spustil a dal help
> breakpoints, vyvalilo to na mna spustu moznosti nastavenia breakpointu.
> Neviem ako to presne nastavit. Ak by ste mi pomohli sa v tom trochu
> zorientovat bol by som rad. Vopred dakujem.

Krok 1: Spustíte program pod debuggerem.

# gdb --args /sbin/hwclock --systohc --directisa

Krok 2: Najdete správné místo v kódu. Tady je to trochu komplikované 
(nejspíš v tom hraje roli inlajnování funkcí). Když se pokusím vypsat 
hledanou funkci (l cmos_set_time), tak mi to vypíše úplně jiné místo v 
kódu (jediné plus je, že je to aspoň správný soubor). Abych Vám ušetřil 
hledání, tak rovnou napovím pravděpodobné číslo řádku (platí pro F22):

(gdb) l sys-utils/hwclock-cmos.c:409
404             tm.tm_year -= cmos_epoch;
405             tm.tm_year %= 100;
406             tm.tm_mon += 1;
407             tm.tm_wday += 1;
408
409             if (!(save_control & 0x02)) {   /* 12hr mode; the default is 24hr mode */
410                     if (tm.tm_hour == 0)
411                             tm.tm_hour = 24;
412                     if (tm.tm_hour > 12) {
413                             tm.tm_hour -= 12;

Je důležité, aby na řádku 409 byl uvedený příkaz, protože to je vhodné 
místo, kde je možno provést chirurgický zásah do save_control.

Krok 3: Nastavte breakpoint a spusťte program:

(gdb) b 409
(gdb) r

Krok 4: Počkejte, až se program zastaví (což bude prakticky ihned). Nechte 
si pro kontrolu vypsat hodnotu save_control, změňte ji, a pro kontrolu ji 
znovu nechte vypsat:

(gdb) p save_control
$1 = 0 '\000'
(gdb) set save_control |= 2
(gdb) p save_control
$2 = 2 '\002'

Krok 5: Nechte program doběhnout do konce a opusťte debugger:

(gdb) c
(gdb) quit

Krok 6: Zkontrolujte, zda jsou v RTC smysluplné údaje a zda funguje 
přístup přes jádro (například spustím hwclock --show s --directisa i bez). 
Také zkuste znovu ten hwc.stp a zkontrolujte, zda je příznak opravdu 
nahozený.

Případně udělejte znovu --systohc už bez --directisa a bez blbnutí 
debuggerem, aby se opravila chyba vnesená při změně příznaku.

Krok 7: Doufejte, že to vydrží a nepřepne se to samo zpět do 12-hodinového 
režimu. :)


-- 
Pavel Kankovsky aka Peak                      "Que sais-je?"


Další informace o konferenci Linux