From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id B7F9E6ECCC; Thu, 4 Jun 2026 12:32:02 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org B7F9E6ECCC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1780565522; bh=JAoU/qkV/CrSDfVnEg9WkYBON8zkhR2zNvIp1RJllJQ=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=ZswG95JuA/3pay419M1y+dg7QjkQrR08mf3P/KGScsCPSsNWMOqTLtYrsyjgc3aNy 9FidlXrcm3ITOiwIADfuD9uigXt/MmD+Mp155U5zoq0Q6c7hiWzBbe/mHAUy7EPNLK dMED/UvOK34/Cp6HIYq0/YIJ/7XjSyZNRNXfM/G8= Received: from send277.i.mail.ru (send277.i.mail.ru [95.163.59.116]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 073F16ECCC for ; Thu, 4 Jun 2026 12:31:32 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org 073F16ECCC Received: by exim-smtp-5b85998476-kbmmh with esmtpa (envelope-from ) id 1wV4QE-00000000I8o-2fMo; Thu, 04 Jun 2026 12:31:31 +0300 To: Sergey Bronnikov , Evgeniy Temirgaleev Date: Thu, 4 Jun 2026 12:30:49 +0300 Message-ID: <20260604093052.2221827-2-skaplun@tarantool.org> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260604093052.2221827-1-skaplun@tarantool.org> References: <20260604093052.2221827-1-skaplun@tarantool.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Mailru-Src: smtp X-4EC0790: 10 X-7564579A: EEAE043A70213CC8 X-77F55803: 4F1203BC0FB41BD9CB32DFFC3F95FD6B88390236BD4FB877488682C115B8EC72182A05F5380850404C228DA9ACA6FE271E12E0B906984C053DE06ABAFEAF670549F07344DC8DE72F91590B24FD7EC5C27351BD83221AC723 X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE70043D879A87EF1BCEA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F7900637AC83A81C8FD4AD23D82A6BABE6F325AC2E85FA5F3EDFCBAA7353EFBB5533756660A56BB7F6F20B604BBD1988B73E1E776F911E34BE6722F38F0A0AB65E0A076F389733CBF5DBD5E913377AFFFEAFD269176DF2183F8FC7C0B27420F9988F54058941B15DA834481FCF19DD082D7633A0EF3E4896CB9E6436389733CBF5DBD5E9D5E8D9A59859A8B6A70DDFFB3186CBC5CC7F00164DA146DA6F5DAA56C3B73B237318B6A418E8EAB86D1867E19FE14079C09775C1D3CA48CF3D321E7403792E342EB15956EA79C166A417C69337E82CC275ECD9A6C639B01B78DA827A17800CE71F4E386938175FB9731C566533BA786AA5CC5B56E945C8DA X-C1DE0DAB: 0D63561A33F958A5311D5CF5939792CE5002B1117B3ED696FF1BE803D529322C9E040399BDE4761E3610D81D389A125CDE35189EBF2DEA28FEA14CD2CD220BB99C5DF10A05D560A9880EC71AF561E0AAD9143641EC25BB39E37876E7723AB534A71A35648BE338CE9510FB958DCE06DB58C12E6D310A6D53A16EC4B4EECACEB3 X-C8649E89: 1C3962B70DF3F0AD73CAD6646DEDE191716CD42B3DD1D34CAB70F9BE574AE9C625B6776AC983F447FC0B9F89525902EE6F57B2FD27647F25E66C117BDB76D6597F7FA41A27475AACCA14EF50E83735D59D185E292F3EE3ECFB7501DDC67AE0464160E36AD3CB0073B8341EE9D5BE9A0A6DB0ABC1DEF4CCC8EF77CD829DB9C1E05F697D0C55FEB1FDC7CEAA0681F5848F4C41F94D744909CECFA6C6B0C050A61A8CAF69B82BA93681CD72808BE417F3B9E0E7457915DAA85F X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu53w8ahmwBjZKM/YPHZyZHvz5uv+WouB9+ObcCpyrx6l7KImUglyhkEat/+ysWwi0gdhEs0JGjl6ggRWTy1haxBpVdbIX1nthFXMZebaIdHP2ghjoIc/363UZI6Kf1ptIMVRI2994ruhLUGLl9dWDcTZE= X-DA7885C5: DD6214F6A5BAACA0F255D290C0D534F9A149EC665216D3B1F227E29AB22559485048AAAE6E3192335B1A4C17EAA7BC4BEF2421ABFA55128DAF83EF9164C44C7E X-Mailru-Sender: 689FA8AB762F7393520AF17B8A65FDE2E6DAD9813CFF8E4F6034FF430E69FBFFD648180C0A790750E49D44BB4BD9522A059A1ED8796F048DB274557F927329BE89D5A3BC2B10C37545BD1C3CC395C826B4A721A3011E896F X-Mras: Ok Subject: [Tarantool-patches] [PATCH luajit 1/4] dbg: fix lj-stack command for LLDB X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Sergey Kaplun via Tarantool-patches Reply-To: Sergey Kaplun Cc: tarantool-patches@dev.tarantool.org Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" This commit is the follow-up for the commit 593fef813b7d36060e0c1b1ae2df0fbc0d604d1f ("lldb: refactor extension"). `GetValueForExpressionPath()` may produce the empty value for negative indexes. This leads to incorrect frame unwinding in the LLDB extension and errors like: | Failed to execute command `lj-stack`: | 'Q' format requires 0 <= number <= 18446744073709551615 This patch adds special handling for the negative indices. --- src/luajit_dbg.py | 49 ++++++++++++++++--- .../debug-extension-tests.py | 26 +++++++--- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/src/luajit_dbg.py b/src/luajit_dbg.py index d9196f06..410f0191 100644 --- a/src/luajit_dbg.py +++ b/src/luajit_dbg.py @@ -255,15 +255,31 @@ class _GDBDebugger(Debugger): class _LLDBDebugger(Debugger): def _lldb_tp_isfp(self, tp): - return tp.GetBasicType() in [ + return tp.GetCanonicalType().GetBasicType() in [ lldb.eBasicTypeFloat, lldb.eBasicTypeDouble, lldb.eBasicTypeLongDouble ] + def _lldb_tp_issigned(self, tp): + return tp.GetCanonicalType().GetBasicType() in [ + lldb.eBasicTypeChar, + lldb.eBasicTypeSignedChar, + lldb.eBasicTypeShort, + lldb.eBasicTypeInt, + lldb.eBasicTypeLong, + lldb.eBasicTypeLongLong, + lldb.eBasicTypeInt128 + ] + def _lldb_value_from_raw(self, raw_value, size, tp): isfp = self._lldb_tp_isfp(tp) - pack_flag = '= 0: + return lldb.value( + lldbval.sbvalue.GetValueForExpressionPath('[%i]' % key) + ) + else: + # GetValueForExpressionPath doesn't work for + # negative offsets. + sbvalue = lldbval.sbvalue + assert sbvalue.TypeIsPointerType(), \ + 'attempt to get index of non-pointer type' + tp = sbvalue.GetType().GetPointeeType() + sz = sbvalue.deref.size + addr = sbvalue.GetValueAsUnsigned() + key * sz + return lldb.value(self.target.CreateValueFromAddress( + '({tp}){addr}'.format(tp=tp, addr=addr), + lldb.SBAddress(addr, self.target), + tp, + )) elif type(key) is str: return lldb.value(lldbval.sbvalue.GetChildMemberWithName(key)) raise Exception(TypeError('No item of type %s' % str(type(key)))) @@ -417,8 +448,12 @@ class _LLDBDebugger(Debugger): # may take the 8 bytes of memory instead of 4, before the # cast. Construct the value on the fly. tp = self._dbgtype(typestr) - is_fp = self._lldb_tp_isfp(tp) - rawval = float(val.GetValue()) if is_fp else val.GetValueAsUnsigned() + if self._lldb_tp_isfp(tp): + rawval = float(val.GetValue()) + elif self._lldb_tp_issigned(tp): + rawval = val.GetValueAsSigned() + else: + rawval = val.GetValueAsUnsigned() return self._lldb_value_from_raw(rawval, val.GetByteSize(), tp) def sizeof(self, typestr): diff --git a/test/tarantool-debugger-tests/debug-extension-tests.py b/test/tarantool-debugger-tests/debug-extension-tests.py index 61529561..7cb60d84 100644 --- a/test/tarantool-debugger-tests/debug-extension-tests.py +++ b/test/tarantool-debugger-tests/debug-extension-tests.py @@ -186,16 +186,30 @@ class TestLJGC(TestCaseBase): ) -class TestLJStack(TestCaseBase): +STACK_RX = ( + r'-+ Red zone:\s+\d+ slots -+\n' + r'(' + RX_ADDR + r'\s+' + RX_FRAME + r' VALUE: nil\n?)*\n' + r'-+ Stack:\s+\d+ slots -+\n' + r'(' + RX_ADDR + r'(:' + RX_ADDR + r')?\s+' + RX_FRAME + r'.*\n?)+\n' +) + + +class TestLJStackBase(TestCaseBase): extension_cmds = 'lj-stack' location = 'lj_cf_print' lua_script = 'print(1)' - pattern = ( - r'-+ Red zone:\s+\d+ slots -+\n' - r'(' + RX_ADDR + r'\s+' + RX_FRAME + r' VALUE: nil\n?)*\n' - r'-+ Stack:\s+\d+ slots -+\n' - r'(' + RX_ADDR + r'(:' + RX_ADDR + r')?\s+' + RX_FRAME + r'.*\n?)+\n' + pattern = STACK_RX + + +# Check LLDB correctness for the specific stack. +class TestLJStackFunc(TestCaseBase): + extension_cmds = 'lj-stack' + location = 'lj_cf_print' + lua_script = ( + 'local function nop() end\n' + 'print()\n' ) + pattern = STACK_RX class TestLJTV(TestCaseBase): -- 2.54.0