Print this page
5554 kmdb can't trace stacks that begin within itself
Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/mdb/intel/mdb/mdb_amd64util.c
          +++ new/usr/src/cmd/mdb/intel/mdb/mdb_amd64util.c
↓ open down ↓ 200 lines elided ↑ open up ↑
 201  201  {
 202  202          mdb_tgt_gregset_t gregs;
 203  203          kreg_t *kregs = &gregs.kregs[0];
 204  204          int got_pc = (gsp->kregs[KREG_RIP] != 0);
 205  205          uint_t argc, reg_argc;
 206  206          long fr_argv[32];
 207  207          int start_index; /* index to save_instr where to start comparison */
 208  208          int err;
 209  209          int i;
 210  210  
 211      -        struct {
      211 +        struct fr {
 212  212                  uintptr_t fr_savfp;
 213  213                  uintptr_t fr_savpc;
 214  214          } fr;
 215  215  
 216  216          uintptr_t fp = gsp->kregs[KREG_RBP];
 217  217          uintptr_t pc = gsp->kregs[KREG_RIP];
 218  218          uintptr_t lastfp = 0;
 219  219  
 220  220          ssize_t size;
 221  221          ssize_t insnsize;
 222  222          uint8_t ins[SAVEARGS_INSN_SEQ_LEN];
 223  223  
 224  224          GElf_Sym s;
 225  225          mdb_syminfo_t sip;
 226  226          mdb_ctf_funcinfo_t mfp;
 227  227          int xpv_panic = 0;
      228 +        int advance_tortoise = 1;
      229 +        uintptr_t tortoise_fp = 0;
 228  230  #ifndef _KMDB
 229  231          int xp;
 230  232  
 231  233          if ((mdb_readsym(&xp, sizeof (xp), "xpv_panicking") != -1) && (xp > 0))
 232  234                  xpv_panic = 1;
 233  235  #endif
 234  236  
 235  237          bcopy(gsp, &gregs, sizeof (gregs));
 236  238  
 237  239          while (fp != 0) {
 238  240                  int args_style = 0;
 239  241  
 240      -                /*
 241      -                 * Ensure progress (increasing fp), and prevent
 242      -                 * endless loop with the same FP.
 243      -                 */
 244      -                if (fp <= lastfp) {
 245      -                        err = EMDB_STKFRAME;
 246      -                        goto badfp;
 247      -                }
 248  242                  if (mdb_tgt_vread(t, &fr, sizeof (fr), fp) != sizeof (fr)) {
 249  243                          err = EMDB_NOMAP;
 250  244                          goto badfp;
 251  245                  }
 252  246  
      247 +                if (tortoise_fp == 0) {
      248 +                        tortoise_fp = fp;
      249 +                } else {
      250 +                        if (advance_tortoise != 0) {
      251 +                                struct fr tfr;
      252 +
      253 +                                if (mdb_tgt_vread(t, &tfr, sizeof (tfr),
      254 +                                    tortoise_fp) != sizeof (tfr)) {
      255 +                                        err = EMDB_NOMAP;
      256 +                                        goto badfp;
      257 +                                }
      258 +
      259 +                                tortoise_fp = tfr.fr_savfp;
      260 +                        }
      261 +
      262 +                        if (fp == tortoise_fp) {
      263 +                                err = EMDB_STKFRAME;
      264 +                                goto badfp;
      265 +                        }
      266 +                }
      267 +
      268 +                advance_tortoise = !advance_tortoise;
      269 +
 253  270                  if ((mdb_tgt_lookup_by_addr(t, pc, MDB_TGT_SYM_FUZZY,
 254  271                      NULL, 0, &s, &sip) == 0) &&
 255  272                      (mdb_ctf_func_info(&s, &sip, &mfp) == 0)) {
 256  273                          int return_type = mdb_ctf_type_kind(mfp.mtf_return);
 257  274                          mdb_ctf_id_t args_types[5];
 258  275  
 259  276                          argc = mfp.mtf_argc;
 260  277  
 261  278                          /*
 262  279                           * If the function returns a structure or union
↓ open down ↓ 249 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX