Как ввести значение при использовании lldb отладить мой код - PullRequest
0 голосов
/ 23 января 2020

Когда я отлаживал свою программу с помощью lldb, я устанавливал точку останова в основной функции, почему она заканчивалась напрямую? Кроме того, терминал должен ждать моего ввода ...

fun c. c

#include "func.h"
        void insert_head(pnode *phead,pnode *ptail,int i){
        pnode pnew = (pnode)calloc(1,sizeof(node));
        pnew->num = i;
        if(phead == NULL){
            *phead = pnew;
            *ptail = pnew;
        }else{
             pnew->pnext = *phead;
            *phead = pnew;
        }
    }

    void print_list(pnode phead){
        while(phead){
            printf("%d",phead->num);
            phead=phead->pnext;
    }
    }

main. cpp

#include "func.h"
   int main()
   {
       pnode phead,ptail;//create new head ptial point to sturct
       phead = ptail = NULL;
       int i;
       while(scanf("%d",&i) != EOF){
           insert_head(&phead,&ptail,i);
       }
      print_list(phead);
      return 0;
  }

веселье c .h

#pragma once
#include <cstdio>
#include <cstdlib>
//定义结构体
typedef struct Node{
    int num;
    struct Node *pnext;
}node,*pnode;

//头插法
void insert_head(pnode *phead,pnode *ptail,int i);
void print_list(pnode phead);

Вы можете увидеть изображение, я хочу выяснить это, пожалуйста, помогите мне, спасибо, ребята

Ответы [ 2 ]

2 голосов
/ 23 января 2020

В приведенном выше примере, во-первых, похоже, что вы не создали свой код с отладочной информацией (передайте -g вызовам вашего компилятора и убедитесь, что вы не удаляете свой двоичный файл). Вот почему, когда вы достигаете своей точки останова в main, вы видите только некоторую разборку, а не исходный код.

Если у вас была отладочная информация, то когда ваша программа достигнет точки останова в main, lldb покажет вам, что вы остановился в начале main, прежде чем ваша программа вызвала scanf для запроса ввода. Вы просто должны быть в состоянии выполнить команду continue в lldb, и ваша программа перейдет к вызову scanf и будет ждать вашего ввода.

Например, этот (предположительно ужасный код) работает в lldb:

> cat scant.c
#include <stdio.h>

int
main()
{
  int i;
  int buffer[2000];
  int idx = 0;
  while(scanf("%d", &i) != EOF) {
    buffer[idx++] = i;
  }
  for(i = 0; i < idx; i++)
    printf("%d: %d\n", i, buffer[i]);
  return 0;
}
> clang -g -O0 scanit.c -o scanit
> lldb scanit
(lldb) target create "scanit"
Current executable set to '/tmp/scanit' (x86_64).
(lldb) break set -n main
Breakpoint 1: where = scanit`main + 41 at scanit.c:8:7, address = 0x0000000100000e89
(lldb) run
Process 74926 launched: '/tmp/scanit' (x86_64)
Process 74926 stopped
* thread #1 tid = 0x71d134 , queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
    frame #0: 0x0000000100000e89 scanit`main at scanit.c:8
    5       {
    6         int i;
    7         int buffer[2000];
 -> 8         int idx = 0;
                      ^
    9         while(scanf("%d", &i) != EOF) {
   10       buffer[idx++] = i;
   11     }
Target 0: (scanit) stopped.
(lldb) c
Process 74926 resuming
10 20 30 40 ^D
0: 10
1: 20
2: 30
3: 40
Process 74926 exited with status = 0 (0x00000000) 
(lldb)

Чтобы правильно выбрать вход с терминала во время работы программы и предоставить его для вызова scanf.

Из того, что я вижу, причина вашей путаницы что вы не создали свою программу с отладочной информацией, поэтому, когда вы остановились на исходной точке останова, вы не поняли, что просто еще не дошли до вызова scanf.

0 голосов
/ 23 января 2020

Для ваших lldb ./test в соответствии с превосходными замечаниями @JimIngham lldb может захватывать пользовательский ввод во время выполнения программы (а не при остановке, например, на точке останова).

Для более сложных программ с пользовательским интерфейсом терминала отдельный терминал windows (один для lldb, один для вашей программы) может быть более удобным.

Чтобы использовать последний подход, либо запустите ./test сначала запрограммируйте терминал, где он ожидает ввода пользователя через scanf.

Запустите другое окно терминала и запустите

lldb -n "test"

, который подключится к запущенному процессу на основе его имени.

Или же вы также можете прикрепить при запуске процесса

lldb -n "test" --wait-for

and in another terminal window
./test

Это позволит вам отладить main и делать все, что вы хотите с вашей программой (включая предоставление пользовательского ввода).

...