Я пытаюсь отлаживать часть программы сборки (x86 64-bit
), и в соответствии с информацией gdb
, он выходит из строя при использовании следующей инструкции:программа падает нормально, но не с Valgrind
xorpd 0x1770(%rip),%xmm12 # 0x40337c <S_0x403230>
Тем не менее, кажется, мне, что память 0x40337c
совершенно нормальна:
(gdb) x /10x 0x40337c
0x40337c <S_0x403230>: 0x00000000 0x80000000 0x00000000 0x00000000
0x40338c <S_0x403240>: 0xf149f2ca 0x00000000 0x746e7973 0x203a7861
0x40339c <S_0x403248+8>: 0x206d626c 0x6d69743c
Другое проводное является то, что этот кусок коды падает каждый раз, когда я запускаю его в командной строке, а также внутри gdb
. Однако, когда я отлаживаю его в valgrind
, он не сбой!
☁ src [master] ⚡ valgrind ./a.out 20 reference.dat 0 1 100_100_130_cf_a.of
==18329== Memcheck, a memory error detector
==18329== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==18329== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==18329== Command: ./a.out 20 reference.dat 0 1 100_100_130_cf_a.of
==18329==
MAIN_printInfo:
grid size : 100 x 100 x 130 = 1.30 * 10^6 Cells
nTimeSteps : 20
result file : reference.dat
action : nothing
simulation type: channel flow
obstacle file : 100_100_130_cf_a.of
LBM_showGridStatistics:
nObstacleCells: 498440 nAccelCells: 0 nFluidCells: 801560
minRho: 1.0000 maxRho: 1.0000 mass: 1.300000e+06
minU: 0.000000e+00 maxU: 0.000000e+00
LBM_showGridStatistics:
nObstacleCells: 498440 nAccelCells: 0 nFluidCells: 801560
minRho: 1.0000 maxRho: 1.0431 mass: 1.300963e+06
minU: 0.000000e+00 maxU: 1.272361e-02
==18329==
==18329== HEAP SUMMARY:
==18329== in use at exit: 0 bytes in 0 blocks
==18329== total heap usage: 4 allocs, 4 frees, 428,801,136 bytes allocated
==18329==
==18329== All heap blocks were freed -- no leaks are possible
==18329==
==18329== For counts of detected and suppressed errors, rerun with: -v
==18329== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Я загрузил двоичный код на here для справки, если вы заинтересованы. Программа сборки фактически создается двоичным перезаписывателем, и я использовал, чтобы иметь возможность создавать бесплатный код. Поэтому я считаю, что это не может быть проблемой для разыменования указателей с отладкой, должно быть что-то очень легко исправить. Однако я действительно не знаю, где идет не так, и кажется, что это нормально в отладке gdb (x/10x 0x40337
)
Так вот мой вопрос,
учитывая отладочная информация (
x/10x 0x40337c
), где может пойти не так?Почему двоичный код не сбой в
valgrind
?
Спасибо, Питер. Теперь я знаю лучше ... У вас есть идея, как это исправить? Поскольку этот указатель ('S_0x403230') относится к местоположению в разделе' .rodata', возможно, это приведет к выравниванию 16b для раздела '.rodata'? – computereasy
Если я правильно помню, около 1,5 лет назад, когда я использовал этот бинарный перезаписыватель и работал над одним и тем же фрагментом кода выше, я должен каким-то образом сделать некоторое выравнивание в выпуске кода сборки, но я больше не помню детали .. Я постараюсь понять это. Спасибо! – computereasy
@computereasy: Да, сделайте все, что вам нужно, чтобы ваши векторные константы были выровнены, вместо того, чтобы изменять вашу программу для использования неуравновешенных нагрузок в регистр tmp. Это звучит как ошибка в вашем программном обеспечении для перезаписи, если она не сохраняет, по крайней мере, выравнивание, указанное в разделах. Вы можете видеть это с помощью 'readelf -S foo.o'. Раздел '.rodata' должен быть частью текстового сегмента, который обычно не менее 16B. 'S_0x403230' звучит так, как исходный адрес был выровнен, так как последняя шестнадцатеричная цифра равна 0. –