Se variablel i gdb

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Se variablel i gdb

Inlägg av JJ »

Jag har problem med något helt grundläggande i gdb. Jag kan inte läsa variabelvärden med print. däremot finns rätt värde på rätt plats i minnet (se nedan). Någon som vet?

Saxat ur gdb:

Breakpoint 2, even () at demo.c:71
71 {
(gdb) print apa
$1 = -18483 <---------felaktigt värde
(gdb) print &apa
$2 = (int *) 0x800060 <---------stämmer med .map-filen
(gdb) x 0x800060
0x800060 <apa>: 0x00000002 <---gdb säger att apa ligger här, värdet rätt!

Det jag kör är WinAVR installerat rakt av på Windows XP. Programmet exekverar i simulavr. samma betende i insight och avr-gdb. (Förresten , insight verkar skakigt men en sak i taget...)
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

....hmm....det har ingenting med att variabeln är en pekare att göra?
Att du skriver ut pekarvärdet eller nåt sådant?

Bara brainstormar lite...
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Inlägg av JJ »

Nej, variabeln är int
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Jag har egentligen ingen aning om varför gdb beter sig så där. Men är du säker på att du har angivit rätt AVR i simulavr? Sen kan du prova att lägga till nyckelordet "volatile" innan "int" i deklarationen, så att det inte är det som spökar. Ett tips är att använda int16_t (uint16_t för unsigned) istället för int så att du enklare ser att det är ett 16-bitars-tal.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

"volatile" betyder bara att ett koll av värdet inte ska optimeras bort, värdet kan ändras av andra delar av programmet eller av hårdvara och därmed kan programmet inte utgå ifrån att värdet inte behöver kollas.

Används ofta som beskrivning av hårdvaru-portar osv.
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Inlägg av JJ »

Tack för hjälpen. Men har redan testat det :-(

Du tycker alltså också att det ser skumt ut, det var en tröst
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Att värdet är fel har jag förstådd men vad ska det vara?

-18483 är ett värde med sign-bit, utan sign-bit blir värdet 47053.
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Inlägg av JJ »

Värdet skall vara 0x2

0x800060 <apa>: 0x00000002 <---gdb säger att apa ligger här, värdet rätt!
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Kan du inte skriva ut C-koden så kanske det hjälper?

Mvh
speakman
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Inlägg av JJ »

Visst kan jag det. En del kommentarer är fel, jag har hackat om demo.c utan att ändra i kommentarer osv.

Detta är vad som händer: main anropar second. second loopar tusen gånger, varannan gån anropas odd, varannan even. Både odd och even inkrementerar apa med ett. Det är alltså ett rent nonsensprogram för att testa lite.


/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <joerg@FreeBSD.ORG> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Joerg Wunsch
* ----------------------------------------------------------------------------
*
* Simple AVR demonstration. Controls a LED that can be directly
* connected from OC1/OC1A to GND. The brightness of the LED is
* controlled with the PWM. After each period of the PWM, the PWM
* value is either incremented or decremented, that's all.
*
* $Id: demo.c,v 1.4 2004/07/21 21:03:07 joerg_wunsch Exp $
*/

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#if defined(__AVR_AT90S2313__)
# define OC1 PB3
# define OCR OCR1
# define DDROC DDRB
#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \
defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \
defined(__AVR_ATmega163__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
#elif defined(__AVR_ATmega8__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#elif defined(__AVR_ATmega32__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
# define OC1 PB5
# define DDROC DDRB
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#else
# error "Don't know what kind of MCU you are compiling for"
#endif

#if defined(COM11)
# define XCOM11 COM11
#elif defined(COM1A1)
# define XCOM11 COM1A1
#else
# error "need either COM1A1 or COM11"
#endif


volatile int16_t apa;


void even()
{
apa++;
}

void odd()
{
apa++;
}

void
second (void)
{

int i = 100;

for(i = 0; i < 1000; i++){
if(0 == i % 2)
even();
else
odd();
}

/* loop forever, the interrupts are doing the rest */

for (;;) /* Note [6] */
;

return (0);
}

int
main (void)
{
second();
}
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg av Rymdninja »

jag ser inte att du initierar apa nånstans. Den kan då få vilket konstigt värde som helst (och visst det kan bli samma flera gånger. jag har felsökt ögonen blodiga efter sådana här fel). Testa med det det kan funka.

En liten,liten optimering också:
Jag tror att % operatorn är ganska slö, kanske inte med % 2 bara men man kan juh byta ut if(0 == i % 2) mot
if(! (i & 0x01))

Hoppas det hjälper
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Icecap skrev:"volatile" betyder bara att ett koll av värdet inte ska optimeras bort, värdet kan ändras av andra delar av programmet eller av hårdvara och därmed kan programmet inte utgå ifrån att värdet inte behöver kollas.

Används ofta som beskrivning av hårdvaru-portar osv.
Ja, visst. Men för att vara helt säker på att det inte är något som optimeras bort så kan det vara bra att testa det.

JJ: Det fungerar bra att debugga den där koden i gdb. Jag provade att sätta en breakpoint på apa++ i odd() att det fungerar som det ska. Jag provade att köra den som en AT90s2313.
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Inlägg av JJ »

Ingen initiering => C runtime initierar variabel till 0.

Tack för optimeringstipset...jag skall försöka förstå när jag fåt gdb att funka överhuvudtaget.

cykze: Jag använde atmeg8 och det gjorde ingen skillnad att byta processor. Jag specificerar uC på två ställen: i make-filen och efter -d-flaggan i simulavr. Det behövs väl inte på fler ställen?

Ett annat sätt att visa mitt problem:

(Den här gången är korrekt värde = 1 och apa är unsigned int.)

(gdb) print *(&apa)
$3 = 1 <---korrekt
(gdb) print apa
$4 = 38401 <---hur kan detta vara annorlunda?
(gdb)

Det känns som om jag missat att konfigurera utskriftsformat eller något...fast jag tycker att jag kollat allt sådant.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Ja, du, det var mycket underligt. Om du ändrar värdet på apa (ex. 'set apa=2') och sedan printar ut det. Hur beter den sig då?

Prova också att ändra apa till en uint8_t istället.
JJ
Inlägg: 366
Blev medlem: 16 maj 2005, 21:33:02

Inlägg av JJ »

Det går typ lika illa :-(

(gdb) print *(&apa)
$5 = 4 '\004'
(gdb) print apa
$6 = 100 'd'
(gdb) set apa = 7
(gdb) print apa
$8 = 7 '\a'
(gdb) print *(&apa)
$9 = 4 '\004'
(gdb) whatis apa
type = uint8_t
(gdb)

Jag skall pröva att installera på en annan dator imorgon. Får se om det går bättre...
Skriv svar