условное отображение в gdb - PullRequest
1 голос
/ 18 июня 2011

Я использую GDB для отладки кода на C ++.На данный момент код, на который я смотрю, перебирает массив указателей, которые являются либо указателем на некоторый объект, либо указателем NULL.

Если я просто display list[index]->member, он будет жаловаться, когда list [index] нулевой.Есть ли способ отобразить член, только если list [index] не равен NULL?Я знаю, что вы можете установить условные контрольные точки (condition <bp-num> <exp>), но я не уверен, как это поможет.

Код, о котором идет речь:

for (int i=0;i<BSIZE*BSIZE;i++){
  if (vms[i]==target) {valid=true; break;}
}

, где vms - массивуказателей.

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Так как display принимает произвольные выражения, вы можете попробовать что-то вроде следующей display команды:

display (list[index]) ? list[index]->member : "null"

Я не уверен, достаточно ли это хорошо очищает то, что вы хотите - выЯ все еще получу дисплей, но это не будет жалобой.

0 голосов
/ 18 июня 2011

В основном условие работает так:

#include <iostream>

int main() {
        for (int i=0; i<10; ++i) {
                std::cerr << i << std::endl;
        }
}

Вы можете отладить его так:

(gdb) break 5
Breakpoint 1 at 0x100000d0e: file foobar.cpp, line 5.
(gdb) condition 1 i==3
(gdb) r
Starting program: /private/tmp/foobar 
Reading symbols for shared libraries ++. done
0
1
2

Breakpoint 1, main () at foobar.cpp:5
5           std::cerr << i << std::endl;
...