Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 6th, 2012  |  syntax: None  |  size: 16.14 KB  |  hits: 13  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. Debugging of a C program (Redis server)
  2. gdb ./redis-server core.16525
  3. GNU gdb (GDB) 7.1-ubuntu
  4. [snip]
  5. Program terminated with signal 11, Segmentation fault.
  6. #0  0x00007f3d9ecd216c in __pthread_rwlock_tryrdlock (rwlock=0x1)
  7.     at pthread_rwlock_tryrdlock.c:46
  8. 46      pthread_rwlock_tryrdlock.c: No such file or directory.
  9.         in pthread_rwlock_tryrdlock.c
  10.        
  11. (gdb) info threads
  12.   3 Thread 16525  zslGetRank (zsl=0x7f3d8d71c360, score=19.498544884710096,
  13.     o=0x7f3d4cab5760) at t_zset.c:335
  14.   2 Thread 16527  0x00007f3d9ecd216c in __pthread_rwlock_tryrdlock (
  15.     rwlock=0x6b7f5) at pthread_rwlock_tryrdlock.c:46
  16. * 1 Thread 16526  0x00007f3d9ecd216c in __pthread_rwlock_tryrdlock (rwlock=0x1)
  17.     at pthread_rwlock_tryrdlock.c:46
  18. (gdb) thread 3
  19. [Switching to thread 3 (Thread 16525)]#0  zslGetRank (zsl=0x7f3d8d71c360,
  20.     score=19.498544884710096, o=0x7f3d4cab5760) at t_zset.c:335
  21. 335     t_zset.c: No such file or directory.
  22.         in t_zset.c
  23. (gdb) bt
  24. #0  zslGetRank (zsl=0x7f3d8d71c360, score=19.498544884710096, o=0x7f3d4cab5760)
  25.     at t_zset.c:335
  26. #1  0x000000000042818b in zrankGenericCommand (c=0x7f3d9dcdc000, reverse=1)
  27.     at t_zset.c:2046
  28. #2  0x00000000004108d4 in call (c=0x7f3d9dcdc000) at redis.c:1024
  29. #3  0x0000000000410c1c in processCommand (c=0x7f3d9dcdc000) at redis.c:1130
  30. #4  0x0000000000419d3f in processInputBuffer (c=0x7f3d9dcdc000)
  31.     at networking.c:865
  32. #5  0x0000000000419e1c in readQueryFromClient (el=<value optimized out>,
  33.     fd=<value optimized out>, privdata=0x7f3d9dcdc000,
  34.     mask=<value optimized out>) at networking.c:908
  35. #6  0x000000000040d4a3 in aeProcessEvents (eventLoop=0x7f3d9dc47000,
  36.     flags=<value optimized out>) at ae.c:342
  37. #7  0x000000000040d6ee in aeMain (eventLoop=0x7f3d9dc47000) at ae.c:387
  38. #8  0x0000000000412a4f in main (argc=2, argv=<value optimized out>)
  39.     at redis.c:1719
  40.        
  41. (gdb) up
  42. #1  0x000000000042818b in zrankGenericCommand (c=0x7f3d9dcdc000, reverse=1)
  43.     at t_zset.c:2046
  44. 2046    in t_zset.c
  45. (gdb) print c->argc
  46. $8 = 3
  47. (gdb) print (redisClient*)c->argc
  48. $9 = (redisClient *) 0x3
  49. (gdb) print (char*)(redisClient*)c->argv[0]->ptr
  50. $10 = 0x7f3d8267ce28 "zrevrank"
  51. (gdb) print (char*)(redisClient*)c->argv[1]->ptr
  52. $11 = 0x7f3d8267ce48 "pc_stat.hkperc"
  53. (gdb) print (long)(redisClient*)c->argv[2]->ptr
  54. $12 = 282472606
  55.        
  56. 2036      } else if (zobj->encoding == REDIS_ENCODING_SKIPLIST) {
  57.   2037          zset *zs = zobj->ptr;
  58.   2038          zskiplist *zsl = zs->zsl;
  59.   2039          dictEntry *de;
  60.   2040          double score;
  61.   2041  
  62.   2042          ele = c->argv[2] = tryObjectEncoding(c->argv[2]);
  63.   2043          de = dictFind(zs->dict,ele);
  64.   2044          if (de != NULL) {
  65.   2045              score = *(double*)dictGetEntryVal(de);
  66.   2046              rank = zslGetRank(zsl,score,ele);
  67.   2047              redisAssert(rank); /* Existing elements always have a rank. */
  68.   2048              if (reverse)
  69.   2049                  addReplyLongLong(c,llen-rank);
  70.   2050              else
  71.   2051                  addReplyLongLong(c,rank-1);
  72.   2052          } else {
  73.   2053              addReply(c,shared.nullbulk);
  74.   2054          }
  75.   2055      }
  76.        
  77. (gdb) print (char*)c->db->dict->ht->table[62]->key
  78. $13 = 0x7f3d9dc0f6c8 "pc_stat.hkperc"
  79.        
  80. (gdb) print *(robj*)c->db->dict->ht->table[62]->val
  81. $16 = {type = 3, storage = 0, encoding = 7, lru = 557869, refcount = 1,
  82.   ptr = 0x7f3d9de574b0}
  83.        
  84. (gdb) print *(zset*)0x7f3d9de574b0
  85. $17 = {dict = 0x7f3d9dcf6c20, zsl = 0x7f3d9de591c0}
  86.        
  87. 2037            zset *zs = zobj->ptr;
  88. 2038            zskiplist *zsl = zs->zsl;
  89.  
  90. (gdb) info locals
  91. zs = 0x7f3d9de574b0
  92. zsl = 0x7f3d9de591c0
  93. de = <value optimized out>
  94. ele = <value optimized out>
  95. zobj = <value optimized out>
  96. llen = 165312
  97. rank = <value optimized out>
  98.        
  99. 2042            ele = c->argv[2] = tryObjectEncoding(c->argv[2]);
  100. 2043            de = dictFind(zs->dict,ele);
  101. 2044            if (de != NULL) {
  102. 2045                score = *(double*)dictGetEntryVal(de);
  103. 2046                rank = zslGetRank(zsl,score,ele);
  104.        
  105. #0  zslGetRank (zsl=0x7f3d8d71c360, score=19.498544884710096, o=0x7f3d4cab5760)
  106.     at t_zset.c:335
  107.        
  108. (gdb) info registers
  109. rax            0x6      6
  110. rbx            0x7f3d9dcdc000   139902617239552
  111. rcx            0xf742d0b6       4148351158
  112. rdx            0x7f3d95efada0   139902485245344
  113. rsi            0x7f3d4cab5760   139901256030048
  114. rdi            0x7f3d8d71c360   139902342775648
  115. rbp            0x7f3d4cab5760   0x7f3d4cab5760
  116. rsp            0x7fffe61a8040   0x7fffe61a8040
  117. r8             0x7fffe61a7fd9   140737053884377
  118. r9             0x1      1
  119. r10            0x7f3d9dcd4ff0   139902617210864
  120. r11            0x6      6
  121. r12            0x1      1
  122. r13            0x7f3d9de574b0   139902618793136
  123. r14            0x7f3d9de591c0   139902618800576
  124. r15            0x7f3d8267c9e0   139902157572576
  125. rip            0x42818b 0x42818b <zrankGenericCommand+251>
  126. eflags         0x10206  [ PF IF RF ]
  127. cs             0x33     51
  128. ss             0x2b     43
  129. ds             0x0      0
  130. es             0x0      0
  131. fs             0x0      0
  132. gs             0x0      0
  133. (gdb) disassemble zrankGenericCommand
  134. Dump of assembler code for function zrankGenericCommand:
  135.    0x0000000000428090 <+0>:     mov    %rbx,-0x30(%rsp)
  136.    0x0000000000428095 <+5>:     mov    %r12,-0x20(%rsp)
  137.    0x000000000042809a <+10>:    mov    %esi,%r12d
  138.    0x000000000042809d <+13>:    mov    %r14,-0x10(%rsp)
  139.    0x00000000004280a2 <+18>:    mov    %rbp,-0x28(%rsp)
  140.    0x00000000004280a7 <+23>:    mov    %rdi,%rbx
  141.    0x00000000004280aa <+26>:    mov    %r13,-0x18(%rsp)
  142.    0x00000000004280af <+31>:    mov    %r15,-0x8(%rsp)
  143.    0x00000000004280b4 <+36>:    sub    $0x58,%rsp
  144.    0x00000000004280b8 <+40>:    mov    0x28(%rdi),%rax
  145.    0x00000000004280bc <+44>:    mov    0x23138d(%rip),%rdx        # 0x659450 <shared+80>
  146.    0x00000000004280c3 <+51>:    mov    0x8(%rax),%rsi
  147.    0x00000000004280c7 <+55>:    mov    0x10(%rax),%rbp
  148.    0x00000000004280cb <+59>:    callq  0x41d370 <lookupKeyReadOrReply>
  149.    0x00000000004280d0 <+64>:    test   %rax,%rax
  150.    0x00000000004280d3 <+67>:    mov    %rax,%r14
  151.    0x00000000004280d6 <+70>:    je     0x4280ec <zrankGenericCommand+92>
  152.    0x00000000004280d8 <+72>:    mov    $0x3,%edx
  153.    0x00000000004280dd <+77>:    mov    %rax,%rsi
  154.    0x00000000004280e0 <+80>:    mov    %rbx,%rdi
  155.    0x00000000004280e3 <+83>:    callq  0x41b270 <checkType>
  156.    0x00000000004280e8 <+88>:    test   %eax,%eax
  157.    0x00000000004280ea <+90>:    je     0x428110 <zrankGenericCommand+128>
  158.    0x00000000004280ec <+92>:    mov    0x28(%rsp),%rbx
  159.    0x00000000004280f1 <+97>:    mov    0x30(%rsp),%rbp
  160.    0x00000000004280f6 <+102>:   mov    0x38(%rsp),%r12
  161.    0x00000000004280fb <+107>:   mov    0x40(%rsp),%r13
  162.    0x0000000000428100 <+112>:   mov    0x48(%rsp),%r14
  163.    0x0000000000428105 <+117>:   mov    0x50(%rsp),%r15
  164.    0x000000000042810a <+122>:   add    $0x58,%rsp
  165.    0x000000000042810e <+126>:   retq  
  166.    0x000000000042810f <+127>:   nop
  167.    0x0000000000428110 <+128>:   mov    %r14,%rdi
  168.    0x0000000000428113 <+131>:   callq  0x426250 <zsetLength>
  169.    0x0000000000428118 <+136>:   testw  $0x3c0,0x0(%rbp)
  170.    0x000000000042811e <+142>:   jne    0x4282b7 <zrankGenericCommand+551>
  171.    0x0000000000428124 <+148>:   mov    %eax,%eax
  172.    0x0000000000428126 <+150>:   mov    %rax,0x8(%rsp)
  173.    0x000000000042812b <+155>:   movzwl (%r14),%eax
  174.    0x000000000042812f <+159>:   and    $0x3c0,%ax
  175.    0x0000000000428133 <+163>:   cmp    $0x140,%ax
  176.    0x0000000000428137 <+167>:   je     0x4281c8 <zrankGenericCommand+312>
  177.    0x000000000042813d <+173>:   cmp    $0x1c0,%ax
  178.    0x0000000000428141 <+177>:   jne    0x428299 <zrankGenericCommand+521>
  179.    0x0000000000428147 <+183>:   mov    0x28(%rbx),%r15
  180.    0x000000000042814b <+187>:   mov    0x8(%r14),%r13
  181.    0x000000000042814f <+191>:   mov    0x10(%r15),%rdi
  182.    0x0000000000428153 <+195>:   mov    0x8(%r13),%r14
  183.    0x0000000000428157 <+199>:   callq  0x41bcc0 <tryObjectEncoding>
  184.    0x000000000042815c <+204>:   mov    0x0(%r13),%rdi
  185.    0x0000000000428160 <+208>:   mov    %rax,0x10(%r15)
  186.    0x0000000000428164 <+212>:   mov    %rax,%rsi
  187.    0x0000000000428167 <+215>:   mov    %rax,%rbp
  188.    0x000000000042816a <+218>:   callq  0x40ede0 <dictFind>
  189.    0x000000000042816f <+223>:   test   %rax,%rax
  190.    0x0000000000428172 <+226>:   je     0x428270 <zrankGenericCommand+480>
  191.    0x0000000000428178 <+232>:   mov    0x8(%rax),%rax
  192.    0x000000000042817c <+236>:   mov    %rbp,%rsi
  193.    0x000000000042817f <+239>:   mov    %r14,%rdi
  194.    0x0000000000428182 <+242>:   movsd  (%rax),%xmm0
  195.    0x0000000000428186 <+246>:   callq  0x427fd0 <zslGetRank>
  196. => 0x000000000042818b <+251>:   test   %rax,%rax
  197.    0x000000000042818e <+254>:   je     0x4282d5 <zrankGenericCommand+581>
  198.    0x0000000000428194 <+260>:   test   %r12d,%r12d
  199.    0x0000000000428197 <+263>:   je     0x4281b0 <zrankGenericCommand+288>
  200.    0x0000000000428199 <+265>:   mov    0x8(%rsp),%rsi
  201.    0x000000000042819e <+270>:   mov    %rbx,%rdi
  202.    0x00000000004281a1 <+273>:   sub    %rax,%rsi
  203.    0x00000000004281a4 <+276>:   callq  0x41a430 <addReplyLongLong>
  204.    0x00000000004281a9 <+281>:   jmpq   0x4280ec <zrankGenericCommand+92>
  205.    0x00000000004281ae <+286>:   xchg   %ax,%ax
  206.    0x00000000004281b0 <+288>:   lea    -0x1(%rax),%rsi
  207.    0x00000000004281b4 <+292>:   mov    %rbx,%rdi
  208.    0x00000000004281b7 <+295>:   callq  0x41a430 <addReplyLongLong>
  209.    0x00000000004281bc <+300>:   nopl   0x0(%rax)
  210.    0x00000000004281c0 <+304>:   jmpq   0x4280ec <zrankGenericCommand+92>
  211.    0x00000000004281c5 <+309>:   nopl   (%rax)
  212.    0x00000000004281c8 <+312>:   mov    0x8(%r14),%r14
  213.    0x00000000004281cc <+316>:   xor    %esi,%esi
  214.    0x00000000004281ce <+318>:   mov    %r14,%rdi
  215.    0x00000000004281d1 <+321>:   callq  0x417600 <ziplistIndex>
  216.    0x00000000004281d6 <+326>:   test   %rax,%rax
  217.    0x00000000004281d9 <+329>:   mov    %rax,0x18(%rsp)
  218.    0x00000000004281de <+334>:   je     0x428311 <zrankGenericCommand+641>
  219.    0x00000000004281e4 <+340>:   mov    %rax,%rsi
  220.    0x00000000004281e7 <+343>:   mov    %r14,%rdi
  221.    0x00000000004281ea <+346>:   callq  0x4175c0 <ziplistNext>
  222.    0x00000000004281ef <+351>:   test   %rax,%rax
  223.    0x00000000004281f2 <+354>:   mov    %rax,0x10(%rsp)
  224.    0x00000000004281f7 <+359>:   je     0x4282f3 <zrankGenericCommand+611>
  225.    0x00000000004281fd <+365>:   mov    0x18(%rsp),%rdi
  226.    0x0000000000428202 <+370>:   mov    $0x1,%r13d
  227.    0x0000000000428208 <+376>:   lea    0x10(%rsp),%r15
  228.    0x000000000042820d <+381>:   test   %rdi,%rdi
  229.    0x0000000000428210 <+384>:   jne    0x428236 <zrankGenericCommand+422>
  230.    0x0000000000428212 <+386>:   jmp    0x428270 <zrankGenericCommand+480>
  231.    0x0000000000428214 <+388>:   nopl   0x0(%rax)
  232.    0x0000000000428218 <+392>:   lea    0x18(%rsp),%rsi
  233.    0x000000000042821d <+397>:   mov    %r14,%rdi
  234.    0x0000000000428220 <+400>:   mov    %r15,%rdx
  235.    0x0000000000428223 <+403>:   callq  0x425610 <zzlNext>
  236.    0x0000000000428228 <+408>:   mov    0x18(%rsp),%rdi
  237.    0x000000000042822d <+413>:   test   %rdi,%rdi
  238.    0x0000000000428230 <+416>:   je     0x428270 <zrankGenericCommand+480>
  239.    0x0000000000428232 <+418>:   add    $0x1,%r13
  240.    0x0000000000428236 <+422>:   mov    0x8(%rbp),%rsi
  241.    0x000000000042823a <+426>:   movslq -0x8(%rsi),%rdx
  242.    0x000000000042823e <+430>:   callq  0x417a40 <ziplistCompare>
  243.    0x0000000000428243 <+435>:   test   %eax,%eax
  244.    0x0000000000428245 <+437>:   je     0x428218 <zrankGenericCommand+392>
  245.    0x0000000000428247 <+439>:   cmpq   $0x0,0x18(%rsp)
  246.    0x000000000042824d <+445>:   je     0x428270 <zrankGenericCommand+480>
  247.    0x000000000042824f <+447>:   test   %r12d,%r12d
  248.    0x0000000000428252 <+450>:   je     0x428288 <zrankGenericCommand+504>
  249.    0x0000000000428254 <+452>:   mov    0x8(%rsp),%rsi
  250.    0x0000000000428259 <+457>:   mov    %rbx,%rdi
  251.    0x000000000042825c <+460>:   sub    %r13,%rsi
  252.    0x000000000042825f <+463>:   callq  0x41a430 <addReplyLongLong>
  253.    0x0000000000428264 <+468>:   jmpq   0x4280ec <zrankGenericCommand+92>
  254.    0x0000000000428269 <+473>:   nopl   0x0(%rax)
  255.    0x0000000000428270 <+480>:   mov    0x2311d9(%rip),%rsi        # 0x659450 <shared+80>
  256.    0x0000000000428277 <+487>:   mov    %rbx,%rdi
  257.    0x000000000042827a <+490>:   callq  0x419f60 <addReply>
  258.    0x000000000042827f <+495>:   jmpq   0x4280ec <zrankGenericCommand+92>
  259.    0x0000000000428284 <+500>:   nopl   0x0(%rax)
  260.    0x0000000000428288 <+504>:   lea    -0x1(%r13),%rsi
  261.    0x000000000042828c <+508>:   mov    %rbx,%rdi
  262.    0x000000000042828f <+511>:   callq  0x41a430 <addReplyLongLong>
  263.    0x0000000000428294 <+516>:   jmpq   0x4280ec <zrankGenericCommand+92>
  264.    0x0000000000428299 <+521>:   mov    $0x44939f,%edi
  265.    0x000000000042829e <+526>:   mov    $0x808,%edx
  266.    0x00000000004282a3 <+531>:   mov    $0x44a674,%esi
  267.    0x00000000004282a8 <+536>:   callq  0x432010 <_redisPanic>
  268.    0x00000000004282ad <+541>:   mov    $0x1,%edi
  269.    0x00000000004282b2 <+546>:   callq  0x40c3a0 <_exit@plt>
  270.    0x00000000004282b7 <+551>:   mov    $0x44a7d0,%edi
  271.    0x00000000004282bc <+556>:   mov    $0x7da,%edx
  272.    0x00000000004282c1 <+561>:   mov    $0x44a674,%esi
  273.    0x00000000004282c6 <+566>:   callq  0x432090 <_redisAssert>
  274.    0x00000000004282cb <+571>:   mov    $0x1,%edi
  275.    0x00000000004282d0 <+576>:   callq  0x40c3a0 <_exit@plt>
  276.    0x00000000004282d5 <+581>:   mov    $0x448982,%edi
  277.    0x00000000004282da <+586>:   mov    $0x7ff,%edx
  278.    0x00000000004282df <+591>:   mov    $0x44a674,%esi
  279.    0x00000000004282e4 <+596>:   callq  0x432090 <_redisAssert>
  280.    0x00000000004282e9 <+601>:   mov    $0x1,%edi
  281.    0x00000000004282ee <+606>:   callq  0x40c3a0 <_exit@plt>
  282.    0x00000000004282f3 <+611>:   mov    $0x44a6e5,%edi
  283.    0x00000000004282f8 <+616>:   mov    $0x7e2,%edx
  284.    0x00000000004282fd <+621>:   mov    $0x44a674,%esi
  285.    0x0000000000428302 <+626>:   callq  0x432090 <_redisAssert>
  286.    0x0000000000428307 <+631>:   mov    $0x1,%edi
  287.    0x000000000042830c <+636>:   callq  0x40c3a0 <_exit@plt>
  288.    0x0000000000428311 <+641>:   mov    $0x44a6bd,%edi
  289.    0x0000000000428316 <+646>:   mov    $0x7e0,%edx
  290.    0x000000000042831b <+651>:   mov    $0x44a674,%esi
  291.    0x0000000000428320 <+656>:   callq  0x432090 <_redisAssert>
  292.    0x0000000000428325 <+661>:   mov    $0x1,%edi
  293.    0x000000000042832a <+666>:   callq  0x40c3a0 <_exit@plt>
  294.    End of assembler dump.
  295.        
  296. /* Try to encode a string object in order to save space */
  297. robj *tryObjectEncoding(robj *o) {
  298.     long value;
  299.     sds s = o->ptr;
  300.  
  301.     if (o->encoding != REDIS_ENCODING_RAW)
  302.         return o; /* Already encoded */
  303.  
  304.     /* It's not safe to encode shared objects: shared objects can be shared
  305.      * everywhere in the "object space" of Redis. Encoded objects can only
  306.      * appear as "values" (and not, for instance, as keys) */
  307.      if (o->refcount > 1) return o;
  308.  
  309.     /* Currently we try to encode only strings */
  310.     redisAssert(o->type == REDIS_STRING);
  311.  
  312.     /* Check if we can represent this string as a long integer */
  313.     if (!string2l(s,sdslen(s),&value)) return o;
  314.  
  315.     /* Ok, this object can be encoded...
  316.      *
  317.      * Can I use a shared object? Only if the object is inside a given
  318.      * range and if this is the main thread, since when VM is enabled we
  319.      * have the constraint that I/O thread should only handle non-shared
  320.      * objects, in order to avoid race conditions (we don't have per-object
  321.      * locking).
  322.      *
  323.      * Note that we also avoid using shared integers when maxmemory is used
  324.      * because very object needs to have a private LRU field for the LRU
  325.      * algorithm to work well. */
  326.     if (server.maxmemory == 0 && value >= 0 && value < REDIS_SHARED_INTEGERS &&
  327.         pthread_equal(pthread_self(),server.mainthread)) {
  328.         decrRefCount(o);
  329.         incrRefCount(shared.integers[value]);
  330.         return shared.integers[value];
  331.     } else {
  332.         o->encoding = REDIS_ENCODING_INT;
  333.         sdsfree(o->ptr);
  334.         o->ptr = (void*) value;
  335.         return o;
  336.     }
  337. }
  338.        
  339. (gdb) print *(robj*)0x7f3d8d71c360
  340. $1 = {type = 0, storage = 0, encoding = 1, lru = 517611, refcount = 2,
  341. ptr = 0x1524db19}
  342.        
  343. 0x7fffe61a8000: 0x40337fa0a3376aff      0x00007f3d9dcdc000
  344. 0x7fffe61a8010: 0x00007f3d9dcdc000      0x00007f3d4cab5760
  345. 0x7fffe61a8020: 0x0000000000000001      0x00007f3d9de574b0
  346. ---> 0x7fffe61a8030: 0x00007f3d9de591c0      0x000000000042818b
  347. 0x7fffe61a8040: 0x0000000000000000      0x00000000000285c0
  348. 0x7fffe61a8050: 0x0000000000000000      0x00007f3d9dcdc000
  349. 0x7fffe61a8060: 0x0000000000000000      0x00007f3d9dcdc000
  350. 0x7fffe61a8070: 0x0000000000000000      0x0004b6b413e12d9a
  351. 0x7fffe61a8080: 0x00000000000003d8      0x0000000000000001
  352.        
  353. 2042   ele = c->argv[2] = tryObjectEncoding(c->argv[2]);