Names of variables, address of their value in the SGA, their datatype and size of the datatype.
2024-08-15: It appears that sys needs to be connected to a CDB root, not a container, in order for x$ksmfsv to return any values.
select
-- addr addr_hex,
-- to_number(addr , rpad('x', 16, 'x')) addr,
ksmfsnam variable_name,
to_number(ksmfsadr, rpad('x', 16, 'x')) address,
ksmfstyp typ,
ksmfssiz siz
from
x$ksmfsv
order by
variable_name
;
Displaying the value of a variable
The column ksmfsadr can be joined to the column addr of x$ksmmem which allows determine the value of an SGA variable.
Note, the returned value is 8 bytes, even if the data type of the variable is different!
select
var.ksmfsnam var_nam,
mem.ksmmmval val_hex,
to_number(mem.ksmmmval, rpad('x', 16, 'x')) val_dec
from
x$ksmfsv var join
x$ksmmem mem on var.ksmfsadr = mem.addr
where
var.ksmfsnam like '%kywmpleq1%'
SCN number (kcsgscn_)
Such a variable is for example kcsgscn_ which stores the current SCN number:
select
to_number(mem.ksmmmval, rpad('x', 16, 'x')) value,
vdb.current_scn
from
x$ksmfsv var join
x$ksmmem mem on var.ksmfsadr = mem.addr cross join
v$database vdb
where
var.ksmfsnam = 'kcsgscn_' -- SCN Number
;
Latches
Many of these variables seem to store the address of latches which are exposed in x$kslld or x$kslltr.
select
-- addr addr_hex,
-- to_number(addr , rpad('x', 16, 'x')) addr,
ksmfsnam variable_name,
lld.kslldnam lld_name,
lld.ksllddsp lld_description,
llt.kslltnam llt_name,
to_number(ksmfsadr, rpad('x', 16, 'x')) address,
ksmfstyp typ,
ksmfssiz siz
from
x$ksmfsv var left join
x$kslld lld on var.ksmfsadr = lld.kslldadr left join
x$kslltr llt on var.ksmfsadr = llt.kslltaddr
where
coalesce(lld.kslldadr, llt.kslltaddr) is not null
;
Dumping variable values with oradebug
ORADEBUG allows to print the value of a variable with the dumpvar command:
oradebug dumpvar kcsgscn
Datatype (column ksmfstyp)
ksmfstyp shows the type of the variable: Some of these types are basic memory units such as uword, ub4, int etc., others seem to refer to some kind of structs, such as ksllt, ksbsa, kzxctok etc. Also seen is void *, size_t, oratext * and many more.
In the case of the type being ksllt, it can be joined to x$kslld to list variables that are related to latches.
Displaying the value of string variables
First, we need to determine the addresses of string variables (i. e. where the type of the SGA variable is oratext *) we want to display:
The string "MS-Author-Via: DAV\r\nDAV: 1,2,<http://www.oracle.com/xdb/webdav/props>\r\n"
sdalfn_
text *
Path of the alert log file ($ORACLE_HOME/rdbms/log/alert_FREE.log)
sdscdd_
text *
The cdump file (something like "/opt/oracle/diag/rdbms/…/…/cdump")
sdsddd_
text *
Trace directory? (something like $ORACLE_HOME/rdbms/log). Compare with sdsudd_
sdsudd_
text *
Trace directory? (something like $ORACLE_HOME/rdbms/log). Compare with sdsddd_
ksudbrmseccnt_ (Unix Epoch)
ksudbrmseccnt_ stores the value of the Unix epoch (seconds since January 1st 1970):
select
date '1970-01-01' + (1/24/60/60) * to_number(mem.ksmmmval, rpad('x', 16, 'x')) as "current time UTC"
from
x$ksmfsv var join
x$ksmmem mem on var.ksmfsadr = mem.addr
where
var.ksmfsnam = 'ksudbrmseccnt_'
;
select
to_char(sysdate - (1/24/60/60) *to_number(mem.ksmmmval, rpad('x', 16, 'x')) / 10, 'yyyy-mm-dd hh24:mi:ss') ticks,
to_char(startup_time , 'yyyy-mm-dd hh24:mi:ss') startup
from
x$ksmfsv var join
x$ksmmem mem on var.ksmfsadr = mem.addr cross join v$instance
where
var.ksmfsnam = 'kstmrmtickcnt_'
;
select
to_char(sysdate - (1/24/60/60) *to_number(mem.ksmmmval, rpad('x', 16, 'x')) / 1000/1000, 'yyyy-mm-dd hh24:mi:ss') ticks,
to_char(startup_time , 'yyyy-mm-dd hh24:mi:ss') startup
from
x$ksmfsv var join
x$ksmmem mem on var.ksmfsadr = mem.addr cross join v$instance
where
var.ksmfsnam = 'kstmlastHighResTime_'
;
select
to_char(sysdate - (1/24/60/60) *to_number(mem.ksmmmval, rpad('x', 16, 'x')) / 1000, 'yyyy-mm-dd hh24:mi:ss') ticks,
to_char(startup_time , 'yyyy-mm-dd hh24:mi:ss') startup
from
x$ksmfsv var join
x$ksmmem mem on var.ksmfsadr = mem.addr cross join v$instance
where
var.ksmfsnam = 'kstmlastLowResTime_'
;
TODO
Variable names that are not exposed:
select
substr(val_hex, 1, 8) kcrf_lgwr_write_cnt_ , -- < This variable (or its name) is not found in x$ksmfsv (likely because it is a word)
substr(val_hex, 9 ) kcrf_max_read_recsz_
from (
select
mem.ksmmmval val_hex
from
x$ksmfsv var join
x$ksmmem mem on var.ksmfsadr = mem.addr
where
var.ksmfsnam = 'kcrf_max_read_recsz_'
);
ksbsa variables:
select
to_number(m_0.ksmmmval, lpad('x', 16, 'x')) id, -- m_0_val,
var.ksmfsnam var_nam,
m_2.ksmmmval m_2_val,
m_x.ksmmmval m_x_val, -- Flags?
v_x.ksmfsnam xnam,
v_x.ksmfstyp xtyp, -- Always ksbdp (or null)
ltrim(m_1.ksmmmval, '0') ptr -- m_1_val
from
x$ksmfsv var join
x$ksmmem m_0 on to_char(to_number(var.ksmfsadr, 'XXXXXXXXXXXXXXXX') + 0,'fm0XXXXXXXXXXXXXXX')= m_0.addr join
x$ksmmem m_1 on to_char(to_number(var.ksmfsadr, 'XXXXXXXXXXXXXXXX') + 8,'fm0XXXXXXXXXXXXXXX')= m_1.addr join
x$ksmmem m_2 on to_char(to_number(var.ksmfsadr, 'XXXXXXXXXXXXXXXX') +16,'fm0XXXXXXXXXXXXXXX')= m_2.addr left join
x$ksmmem m_x on m_1.ksmmmval = m_x.addr left join
x$ksmfsv v_x on m_x.addr = v_x.ksmfsadr
where
var.ksmfstyp = 'ksbsa'
order by
-- m_2.ksmmmval -- index
v_x.ksmfsnam
;
krdrsb_ckpt_action_
with cnt as (select (level-1) * 8 as val from dual connect by level <= 3)
select
mem.addr,
mem.ksmmmval mem_val
from
cnt cross join
x$ksmfsv var join
x$ksmmem mem on to_char(to_number(var.ksmfsadr, 'XXXXXXXXXXXXXXXX') + cnt.val,'fm0XXXXXXXXXXXXXXX')= mem.addr
where
var.ksmfsnam like 'krdrsb_ckpt_action_'
;
alter system checkpoint;
Select continuous memory values
with cnt as (select (level-1) * 8 as val from dual connect by level <= 18)
select
-- var.ksmfsnam var_nam,
mem.addr,
mem.ksmmmval mem_val
from
cnt cross join
x$ksmfsv var join
x$ksmmem mem on to_char(to_number(var.ksmfsadr, 'XXXXXXXXXXXXXXXX') + cnt.val,'fm0XXXXXXXXXXXXXXX')= mem.addr
where
var.ksmfsnam like 'ksusrollat_'
;
Misc
Failed attempt to read gets and immedate_gets for a latch
select
-- var.ksmfsnam var_nam,
mem.addr,
mem.ksmmmval mem_val
from
x$ksmfsv var join
x$ksmmem mem on to_char(to_number(var.ksmfsadr, 'XXXXXXXXXXXXXXXX') + 1*8,'fm0XXXXXXXXXXXXXXX')= mem.addr
where
var.ksmfsnam like 'ksusoln_' -- 'session allocation'
;
select
to_char( gets, 'xxxxxxxx') g,
to_char(immediate_gets, 'xxxxxxxx') i
from
v$latch
where
name = 'session allocation';