kgdb 给出令人困惑的变量内容

问题描述 投票:0回答:1

我正在使用 kgdb 调试在 sbc 上运行的 riscv Linux 内核。 gdb 连接到启用了 kgdb 的 Linux 内核后,gdb 中的 print 命令会产生令人困惑的结果。

例如,在执行语句

host = kzalloc(sizeof(struct mmc_host) + extra, GFP_KERNEL);
后,
p *host
会产生以下结果。但根据 kzalloc 注释,该主机结构的所有内容都应该为 0。

还有其他一些变量内容与实际情况相差甚远的例子。当我们使用 kgdb 调试 Linux 内核时,这是预期的吗?

>>> p *host
$38 = {
  parent = 0x650000000000636d,
  class_dev = {
    kobj = {
      name = 0x20642520726f7272 <error: Cannot access memory at address 0x20642520726f7272>,
      entry = {
        next = 0x6974736575716572,
        prev = 0x757461747320676e
      },
      parent = 0x4300000000000a73,
      kset = 0x6375747320647261,
      ktype = 0x6f7277206e69206b,
      sd = 0x657461747320676e,
      kref = {
        refcount = {
          refs = {
            counter = 1931812897
          }
        }
      },
      state_initialized = 0,
      state_in_sysfs = 0,
      state_add_uevent_sent = 0,
      state_remove_uevent_sent = 0,
      uevent_suppress = 0
    },
    parent = 0x782325203a737574,
    p = 0x660000000000000a,
    init_name = 0x6f725f6563726f <error: Cannot access memory at address 0x6f725f6563726f>,
    type = 0x7200000000000000,
    bus = 0x755f6b636f6c5f6f,
    driver = 0x78656e5f6c69746e,
    platform_data = 0x5f7265776f705f74,
    driver_data = 0x100000000006e6f,
    mutex = {
      owner = {
        counter = 2325059501578864179
      },
      wait_lock = {
        {
          rlock = {
            raw_lock = {<No data fields>}
          }
        }
      },
      wait_list = {
        next = 0x25000000000a6425,
        prev = 0x1000a786c6c3830
      }
    },
    links = {
      suppliers = {
        next = 0x3a6b6c62636d6d33,
        prev = 0x6e20646c756f6320
      },
      consumers = {
        next = 0x736967657220746f,
        prev = 0x424d505220726574
      },
      needs_suppliers = {
        next = 0x7079742073756220,
        prev = 0x100000000000a65
      },
      defer_hook = {
        next = 0x3a6b6c62636d6d33,
        prev = 0x2064656c69616620
      },
      need_for_probe = 116,
      status = 1668246636
    },
    power = {
      power_state = {
        event = 543519841
      },
      can_wakeup = 0,
      async_suspend = 1,
      in_dpm_list = false,
      is_prepared = false,
      is_suspended = true,
      is_noirq_suspended = true,
      is_late_suspended = true,
      no_pm = false,
      early_init = false,
      direct_complete = false,
      driver_flags = 1919443744,
      lock = {
        {
          rlock = {
            raw_lock = {<No data fields>}
          }
        }
      },
      should_wakeup = 0,
      subsys_data = 0xa6e6f69676572,
      set_latency_tolerance = 0x100000000000000,
      qos = 0x3a6b6c62636d6d36
    },
    pm_domain = 0x2520676e69737520,
    pins = 0x73726f6e696d2064,
    dma_mask = 0x7665642072657020,
    coherent_dma_mask = 2666130979577750377,
    bus_dma_limit = 7286934618062731891,
    dma_range_map = 0xa642520726f7272,
    dma_parms = 0x2500000000000000,
    dma_pools = {
      next = 0x2061746164203a73,
      prev = 0x642520726f727265
    },
    dma_mem = 0x10000000000000a,
    cma_area = 0x636f4c203a732536,
    archdata = {<No data fields>},
    of_node = 0x6f6f6220676e696b,
    fwnode = 0x7469747261702074,
    devt = 544108393,
    id = 1965059954,
    devres_lock = {
      {
        rlock = {
          raw_lock = {<No data fields>}
        }
      }
    },
    devres_head = {
      next = 0x78656e206c69746e,
      prev = 0x207265776f702074
    },
    class = 0x1000000000a6e6f,
    groups = 0x636572203a732533,
    release = 0x616620797265766f,
    iommu_group = 0x6e000a2164656c69,
    iommu = 0x642065726f6d206f,
    offline_disabled = true,
    offline = false,
    of_node_reused = true,
    state_synced = false,
    dma_coherent = false
  },
  index = 1986076787,
  ops = 0x6d0000000a656c62,
  pwrseq = 0x2575256b6c62636d,
  f_min = 115,
  f_max = 671088640,
  f_init = 2715506,
  f_src = 1828716544,
  ocr_avail = 1667195757,
  ocr_avail_sdio = 1819307375,
  ocr_avail_sd = 6648933,
  ocr_avail_mmc = 16777216,
  ws = 0x2064656c69614633,
  max_current_330 = 1663070068,
  max_current_300 = 1952540018,
  max_current_180 = 1835868261,
  caps = 1868767331,
  caps2 = 1701605485,
  fixed_drv_type = 1852795252,
  pm_caps = 1919907616,
  max_seg_size = 1702195563,
  max_segs = 25973,
  unused = 0,
  max_req_size = 16777216,
  max_blk_size = 980624694,
  max_blk_count = 544417056,
  max_busy_timeout = 622883621,
  lock = {
    {
      rlock = {
        raw_lock = {<No data fields>}
      }
    }
  },
  ios = {
    clock = 1931812979,
    vdd = 10,
    power_delay_ms = 16777216,
    bus_mode = 51 '3',
    chip_select = 37 '%',
    power_mode = 115 's',
    bus_width = 58 ':',
    timing = 32 ' ',
    signal_voltage = 99 'c',
    drv_type = 111 'o',
    enhanced_strobe = 117
  },
  use_spi_crc = 0,
  claimed = 0,
  bus_dead = 1,
  doing_init_tune = 1,
  can_retune = 0,
  doing_retune = 1,
  retune_now = 1,
  retune_paused = 0,
  use_blk_mq = 0,
  retune_crc_disable = 0,
  can_dma_map_merge = 1,
  rescan_disable = 1629516911,
  rescan_entered = 1663067236,
  need_retune = 1634885992,
  hold_retune = 1919251555,
  retune_period = 1986356256,
  retune_timer = {
    entry = {
      next = 0x10000000a656369,
      pprev = 0x207325203a732536
    },
    expires = 7598824234099438373,
    function = 0x207525206e6f6974,
    flags = 539783973
  },
  trigger_card_event = 100,
  card = 0x10000000a296425,
  wq = {
    lock = {
      {
        rlock = {
          raw_lock = {<No data fields>}
        }
      }
    },
    head = {
      next = 0x207325203a732536,
      prev = 0x6974726170207325
    }
  },
  claimer = 0x207525206e6f6974,
  claim_cnt = 684837,
  default_ctx = {
    task = 0x25006473635f7478
  },
  detect = {
    work = {
      data = {
        counter = 8223649134899378803
      },
      entry = {
        next = 0x20797265766f6365,
        prev = 0x25000a7472617473
      },
      func = 0x7220455143203a73
    },
    timer = {
      entry = {
        next = 0x20797265766f6365,
        pprev = 0x100000a656e6f64
      },
      expires = 7165029233473037619,
      function = 0x6f6f6220676e696b,
      flags = 1634738292
    },
    wq = 0x75206f72206e6f69,
    cpu = 1818850414
  },
  detect_change = 1869619316,
  slot = {
    cd_irq = 1713401455,
    cd_wake_enabled = 97,
    handler_priv = 0x1000a6425203a64
  },
  bus_ops = 0x6b6e75203a732533,
  bus_refs = 1853321070,
  sdio_irqs = 1769104416,
  sdio_irq_thread = 0x6365707320726576,
  sdio_irq_work = {
    work = {
      data = {
        counter = 7309464380119803497
      },
      entry = {
        next = 0xa6e6f69746172,
        prev = 0x6d00000000000000
      },
      func = 0x6d00006b6c62636d
    },
    timer = {
      entry = {
        next = 0x6b636f6c625f636d,
        pprev = 0x6400000000000000
      },
      expires = 7867634009205270898,
      function = 0x2f65726f632f636d,
      flags = 1668246626
    },
    wq = 0x6d00000000000000,
    cpu = 1918853997
  },
  sdio_irq_pending = false,
  sdio_irq_thread_abort = {
    counter = 1392508928
  },
  pm_flags = 842026309,
  led = 0x5300004734304d45,
  supply = {
    vmmc = 0x5300004738304d45,
    vqmmc = 0x5300004736314d45
  },
  debugfs_root = 0x5300004732334d45,
  ongoing_mrq = 0x530032332d424d44,
  actual_clock = 858803524,
  slotno = 1291845682,
  dsr_req = 942687053,
  dsr = 1291845703,
  cqe_ops = 0x4d0000473631434d,
  cqe_private = 0x410000473233434d,
  cqe_qdepth = 1146298438,
  cqe_enabled = false,
  cqe_on = false,
  ever_unplugged = false,
  hsq_enabled = 65,
  private = 0xffffffe0007b7b19
}
debugging linux-kernel gdb kgdb
1个回答
0
投票

这是预料之中的吗

内核是在优化的情况下编译的。并且 that 可能会在调试过程中导致各种工件。

有可能变量

host
还没有被赋值,因此指向随机地址。可以肯定的是,您应该检查汇编指令并确认
kzalloc
实际上已被调用并且结果已分配给变量。

相关问题:12

© www.soinside.com 2019 - 2024. All rights reserved.