您的位置:首页 > 博客中心 > 数据库 >

Linux-GDB调试

时间:2022-03-10 18:08

rrun运行.程序还没有运行前使用c            cuntinue  运行到下一断点处qquit                       退出tabtab命令补全功能h   help帮助sstep跟入函数nnext执行下一行的代码。如果是函数调用,也当作一行代码,执行到此函数返回b   breakpoint

设置断点,用法:(1)b 函数名 (2)b 文件名:行号

info binfo breakpoints查看断点数deldelete删除断点:delete 断点号l list列出代码行。一次列10 行。 也可在 list 后面跟上 文件名:行号watchwatch观察一个变量的值。每次中断时都会显示这个变量的值whatwhat显示变量的类型pprint打印一个变量的值。print 也可改变一个值,通过指令 p b = 100,变量b 的值就变成100了startstart从主函数 main 开始运行调试finfinish运行直至当前函数返回

  • watchpoint只能在当前scope里设置.

  • watchpoint在脱离scope后.所有失去scope的变量会被自动删除.

  • watchpoint监视的是内存值的变化.如果内存值被赋予了一个一样的值.那也不会起作用.


  • 类似$arg0这些已经在gdb中定义的变量.

  • 任何在当前 scpoe里的变量

  • 定义了的字符,数字常量

  • 预处理了的宏

  • 语言里的条件判断

  • void crossout(int k)
    { int i;

    for (i = k; i*k <= n; i++) {
    prime[i*k] = 0;
    }
    }

    // worker thread routine
    void *worker(int tn) // tn is the thread number (0,1,...)
    { int lim,base;

    // no need to check multipliers bigger than sqrt(n)
    lim = sqrt(n);

    do {
    // get next sieve multiplier, avoiding duplication across threads
    pthread_mutex_lock(&nextbaselock);
    base = nextbase += 2;
    pthread_mutex_unlock(&nextbaselock);
    if (base <= lim) {
    work[tn]++; // log work done by this thread
    // don‘t bother with crossing out if base is known to be
    // composite
    if (prime[base]) 
    crossout(base);
    }
    else return; 
    } while (1);
    }

    main(int argc, char **argv)
    { int nprimes, // number of primes found 
    totwork, // number of base values checked
    i;
    void *p;

    n = atoi(argv[1]);
    nthreads = atoi(argv[2]);
    for (i = 2; i <= n; i++) 
    prime[i] = 1;
    crossout(2);
    nextbase = 1;
    // get threads started
    for (i = 0; i < nthreads; i++) {
    pthread_create(&id[i],NULL,(void *) worker,(void *) i);
    }

    // wait for all done
    totwork = 0;
    for (i = 0; i < nthreads; i++) {
    pthread_join(id[i],&p);
    printf("%d values of base done\n",work[i]);
    totwork += work[i];
    }
    printf("%d total values of base done\n",totwork);

    // report results
    nprimes = 0;
    for (i = 2; i <= n; i++) 
    if (prime[i]) nprimes++;
    printf("the number of primes found was %d\n",nprimes);

    }

    为什么你的程序会崩溃?

    在写c/c++程序时.最常见的崩溃就是

    invalid access of memory 读取了没有权限的内存导致崩溃.出现这种情况时. 硬件会执行一个jump命令到操作系统.由操作系统处理.

    调试时,内存是在Virtual Memory(VM)里模拟.这也是为了方便内存调试.

    反应在xcode里就是segementation fault/seg fault

    在visual studio里是general protection fault 反正不管怎么取名.它的意思就是说程序读了它不该读的内存.

     

    正是因为在调试时内存是在虚拟内存里分配的.所以有一些segmentation fault不是很明显.原因是:

    在VM里的内存分配有一个最小分配值.取名叫page. 在奔腾系统处理器里.这个值默认为4096 bytes.所以当你有一个程序占用了10000 bytes时.它总共会占用3个page.而不是2.5个.page已经是最小单位.不能再分割.

    这就会出现一个问题.如果程序在多出来的page里出了错.很可能在调试时并不会报错.


    本文出自 “” 博客,请务必保留此出处

    热门排行

    今日推荐

    热门手游