Početak›Forumi›Linuks›Programiranje›Problem sa gdb-om(DDD)
- This topic has 8 odgovora, 3 glasa, and was last updated 16 years, 7 months ranije by stanko.
-
AutorČlanci
-
31. avgust 2007. u 6:24 pm #9151stankoUčesnik
Moram da debugg-ujem jedan C program ali nailazim na mali problem…
Ovako izgleda deo koda,tacnije pocetak main-a:[code]
….int main(int argc, char *argv[]){
char c;
int task,syscall,idt,symbol,network,finger,check,device,kernel,archi,ommap,map,all;
char *archiarg, *kernelarg, *devicearg, *taskarg, *maparg, *fingerarg, *allarg;task = syscall = idt = symbol = network = finger = check = device = kernel = archi = ommap = map = all = 0;
archiarg = kernelarg = devicearg = taskarg = maparg = fingerarg = allarg = NULL;
if(getuid() != 0){
fprintf(stderr, “You must be root !!\n”);
exit(-1);
}while((c = getopt(argc, argv, “hz:vp::sxnf:ict:d:a:k:m”)) != -1){
switch(c){
case ‘h’ :
help(argv[0]);
break;
case ‘z’ :
all++;
allarg = optarg;
break;
case ‘v’ :
printf(“VERSION %s\n”, VERSION);
exit(0);
break;
case ‘p’:
task++;
if(optarg != NULL)
taskarg = optarg+1;
break;
…
[/code]
Koristim DDD i hocu da stavim breakpoint na case ‘z’ ali mi to nista ne znaci dok ne prosledim argument z.
Da li moze nekako da se prosledi ili da menjam kod tj. da ucitavam arg posebno???31. avgust 2007. u 9:38 pm #61088jbobanUčesnikDa li moze nekako da se prosledi ili da menjam kod tj. da ucitavam arg posebno???
Ako sam dobro razumeo, prilikom starta gdb-a prosledi mu program i željeni parametar:
[code]gdb program z[/code]1. septembar 2007. u 12:56 pm #61089stankoUčesnikHm,mislim da to tako neide…taj drugi argument koji si naveo(z) gdb razume da je to folder u koji zelim uci…i on naravno ne postoji.
Mnogo bi mi prakticnije bilo kada bih mogao da debugg-ujem preko gdb-a ali koristeci DDD…1. septembar 2007. u 3:08 pm #61090sysctlUčesnikA sta kaze
[code]
gdb program -z
[/code](crtica ispred z)
getopt parzuje switch-eve iz argv
1. septembar 2007. u 3:19 pm #61091stankoUčesnikgdb: unrecognized option `-z’
Da,getopt parsuje switcheve…i nije mi problem da to prepravim na drugi nacin ali me prosto zanima da li je ikako moguce proslediti argument i da pritom ostavim kod kakav jeste.
1. septembar 2007. u 4:08 pm #61092sysctlUčesnikOk, probaj ovako.
[code]
gdb mojprog
(gdb) set args z
(gdb) break mojprog.c:20
(gdb) run
[/code]Ovo mojprog.c:20 je ima fajla izvornog koda i linija gde hoces da postavis break
sada sa print ime promenljive ispitujes njihove vrednosti, npr za promenljivu x[code]
(gdb) print x
[/code]kada hoces da nastavis
[code]
(gdb) continue
[/code]E sad malo sam zardjao, ali ptype x daje tip promenljive, bt je stacktrace, sa frame se setas po stack-u koje je dao bt, a up i down se seta po jedan frejm gore i dole, valjda.
1. septembar 2007. u 5:27 pm #61093stankoUčesnikOK,evo ovako izgleda:
[code]
(gdb) set args z
(gdb) break main.c:70
Breakpoint 1 at 0x804972e: file main.c, line 70.
(gdb) run
Starting program: program z
Help : -hProgram exited normally.
[/code]
…sto znaci da treba ipak -z
[code]
(gdb) set args -z
Starting program: program -z
program: option requires an argument — z
Help : -hProgram exited normally.
[/code]
::) ?Ovo set args funkcionise samo mi nije jasno kako da zadam argument?
Program u konsoli normalno pozivam sa program -z ali… ::)1. septembar 2007. u 5:37 pm #61094sysctlUčesnikDa, da, to sam i mislio -z. Nego problem je ovde
[code]
while((c = getopt(argc, argv, “hz:vp::sxnf:ict:d:a:k:m”)) != -1){
[/code]gore u kodu iza z stoji dvotacka (z:), a koliko se secam za getopt dvotacka iza switcha znaci da on zahteva argument na primer [tt]mojprog -z 2[/tt], u tvom slicaju je allarg char*, pa znaci [tt]mojprog -z tekst[/tt]
ako ne navedes argument iza z, onda se parzuje drugi switch sto i daje gresku.Sta kaze izlaz [tt]mojprog -z[/tt] bez ikakvih drugih argumenata. Vise detalja za getopt: [tt]man 3 getopt[/tt]
znaci argument zadajes sa
[code]
(gdb) set args -z neki_tekst
[/code]i naravno sve druge argumenta koji su potrebni
2. septembar 2007. u 1:38 pm #61095 -
AutorČlanci
Moraš biti prijavljen da bi postavio komentar u ovoj temi.