the test case “test_step_over_with_dwarf_python” for unit test 
"functionalities/step-avoids-no debug” passes when compiling the unit test with 
clang and fails when compiling with gcc, when i run the unit test in linux 
(ubuntu 14.04).    note: to run this test case in linux, you have to comment 
out the “@skipIfLinux # intermittent failure” line.

the failure happens when the python code in TestStepNoDebug.py does the first 
self.thread.StepOut() after the breakpoint.

this appears to be caused by gcc generating significantly different code than 
clang.  clang associates 20 bytes of machine code (all of the machine code 
related to the source line) to the breakpoint source line (line 12), but gcc 
only associates the first 3 bytes of machine code to line 12.  gcc associates 
the remaining bytes related to line 12 with line 13.  the corresponding code 
for both versions is shown at the bottom of this email.

this difference means that when the self.thread.StepOut() is executed in the 
clang version, the program steps to the source line of the calling routine 
(line 19), but the gcc version steps to the next source line (line 13).  this 
mismatch causes TestStepNoDebug.py to report a failure not really caused by 
lldb, but really just a compiler difference.

it seems like the tests in TestStepNoDebug.py should be rewritten to include 
different tests for clang and gcc, or the test should be restructured to not 
rely on compiler differences - at least not clang and gcc differences.



shown below is the objdump for the clang version.  the 20 bytes from 40055c 
thru 40056f (inclusive) are associated with source line 12 (no bytes are 
associated with source line 13).

int
called_from_nodebug_actual(int some_value)
{
  400530:       55                      push   %rbp
  400531:       48 89 e5                mov    %rsp,%rbp
  400534:       48 83 ec 10             sub    $0x10,%rsp
  400538:       48 b8 d4 06 40 00 00    movabs $0x4006d4,%rax
  40053f:       00 00 00 
  400542:       89 7d fc                mov    %edi,-0x4(%rbp)
  int return_value = 0;
  400545:       c7 45 f8 00 00 00 00    movl   $0x0,-0x8(%rbp)
  return_value  = printf ("Length: %d.\n", some_value);
  40054c:       8b 75 fc                mov    -0x4(%rbp),%esi
  40054f:       48 89 c7                mov    %rax,%rdi
  400552:       b0 00                   mov    $0x0,%al
  400554:       e8 b7 fe ff ff          callq  400410 <printf@plt>
  400559:       89 45 f8                mov    %eax,-0x8(%rbp)
  return return_value; // Stop here and step out of me
  40055c:       8b 45 f8                mov    -0x8(%rbp),%eax
  40055f:       48 83 c4 10             add    $0x10,%rsp
  400563:       5d                      pop    %rbp
  400564:       c3                      retq   
  400565:       66 66 2e 0f 1f 84 00    data32 nopw %cs:0x0(%rax,%rax,1)
  40056c:       00 00 00 00 

0000000000400570 <called_from_nodebug>:
}



shown below is the objdump for the gcc version.  the 3 bytes from 400556 thru 
400558 (inclusive) are associated with source line 12, and the 2 bytes from 
400559 thru 40055a (inclusive) are associated with source line 13.

called_from_nodebug_actual(int some_value)
{
  40052d:       55                      push   %rbp
  40052e:       48 89 e5                mov    %rsp,%rbp
  400531:       48 83 ec 20             sub    $0x20,%rsp
  400535:       89 7d ec                mov    %edi,-0x14(%rbp)
  int return_value = 0;
  400538:       c7 45 fc 00 00 00 00    movl   $0x0,-0x4(%rbp)
  return_value  = printf ("Length: %d.\n", some_value);
  40053f:       8b 45 ec                mov    -0x14(%rbp),%eax
  400542:       89 c6                   mov    %eax,%esi
  400544:       bf 94 06 40 00          mov    $0x400694,%edi
  400549:       b8 00 00 00 00          mov    $0x0,%eax
  40054e:       e8 bd fe ff ff          callq  400410 <printf@plt>
  400553:       89 45 fc                mov    %eax,-0x4(%rbp)
  return return_value; // Stop here and step out of me
  400556:       8b 45 fc                mov    -0x4(%rbp),%eax
}
  400559:       c9                      leaveq 
  40055a:       c3                      retq   

000000000040055b <called_from_nodebug>:


doug

_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to